2016-05-16 2 views
2

Итак, у меня возникла проблема с созданием объекта.Создание возражения, вызванное множественными значениями регулярных выражений

У меня есть несколько canonicalIds например.

school/1 
school/1/class/12/ 
school/1/class/12/teacher/35 

У меня есть разные объекты, которые представляют их и создаются с идентификатора. то, что я хочу сделать чистым способом, - это цикл через регулярные выражения и определить, какой именно объект.

Я застрял в определении того, как мне следует согласовать регулярное выражение с конкретным методом фабрики.

Я хочу извлечь тип, который определяется последним словом в строке. но и идентификаторы, а затем делегировать это службе для извлечения объекта из хранилища данных. все на месте, кроме клея. Я чувствую, что это лучший способ, чем с массивным, если/другое заявление

class Factory() 
{ 
    object create(string value) 
    { 
    if(match1.ismatch(value)) 
    { 
     //getting match groups and then using the values to get an object from a data store 
     var schoolid= mactch.group[1].value; 
     return new SchoolSerice().GetSchool(schoolid); 
    } 
    if(match2.ismatch(value)) 
    {   
     var schoolid= mactch.group[1].value; 
     var classid= mactch.group[2].value; 
     return new SchoolSerice().GetClass(schoolid,classid); 
    } 
    } 
+0

вы можете быть немного более конкретно о том, что вы хотите извлечь .. – rock321987

+0

отредактированного сообщения с расширенными данными – BastanteCaro

+0

я могу себе представить, применяя шаблон стратегии здесь, но если честно, я не вижу никакой пользы. Код будет разложен, а логика сложнее «видеть». Я предлагаю вам создавать такие функции, как 'isSchool()', 'isClass()' и т. Д. Для инкапсуляции логики регулярных выражений. Это сделает ваши инструкции 'if' более читаемыми. – Fuhrmanator

ответ

0

Вы, вероятно, понадобится Reflection, который позволит динамически вызвать метод, либо GetSchool, GetClass или любой другой. Вы можете посмотреть на это post, так как мой ответ основан на нем.

Я только проверял часть регулярного выражения, так как я не испытывал отражения, поэтому я просто попытался указать вам в правильном направлении.

Regex: "([^\\/]+)\\/([^\\/]+)"

([^\\/]+) # Capture group #1, will capture any character until forward slash, which will be object name 
\\/  #forward slash, 
([^\\/]+) # Capture group #2, will capture any character until forward slash or end of string, which will be id 

Имя метода будет формироваться из имени объекта последнего матча предшествуют Get. Все идентификаторы будут помещены в массив int, и этот массив будет передан как аргумент для вызова метода. Я принимаю schoolid и classid: int, если они вам нужны, как строка, просто удалите Int32.Parse().


Пример кода.

class Factory() 
{ 
     object create(string value) 
     { 

      Type type = Type.GetType("SchoolSerice"); 
      Object obj = Activator.CreateInstance(type); 
      MethodInfo methodInfo; 

      string pattern = "([^\\/]+)\\/([^\\/]+)"; 
      string methodName = ""; 
      List<int> argsList = new List<int>(); 
      int[] argsArray; 

      foreach (Match m in Regex.Matches(value, pattern)) 
      { 
       methodName="get"+char.ToUpper(m.Groups[1].Value[0]) + m.Groups[1].Value.Substring(1); 
       argsList.Add(Int32.Parse(m.Groups[2].Value)); 
      } 

      argsArray=argsList.ToArray(); 
      methodInfo = type.GetMethod(methodName); 

      return new methodInfo.Invoke(obj, argsArray); 

     } 
} 
Смежные вопросы