多个正则表达式值预测的异议创建

时间:2016-05-16 13:40:46

标签: c# regex design-patterns factory-pattern

所以..我有一个对象创建模式的问题。

我有多个canonicalIds,例如。

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

我有不同的对象代表这些并从id创建。 我想以干净的方式做的是循环使用正则表达式'并确定它是哪个对象。

我决定如何将正则表达式与特定工厂方法匹配。

我想提取由字符串中的最后一个单词确定的类型。但也是id,然后将其委托给服务以从数据存储中检索对象。除胶水外,一切都到位了。我觉得有一个更好的方法比拥有一个大规模的if / else语句

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);
     }
  }

1 个答案:

答案 0 :(得分:0)

您可能需要Reflection,这将允许您动态调用方法,GetSchoolGetClass或其他任何方法。您可以查看此post,因为我的答案是基于它的。

我只验证了正则表达式部分,因为我没有经历过反射,所以我只是想指出你正确的方向。

正则表达式:"([^\\/]+)\\/([^\\/]+)"

([^\\/]+) # 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前面的最后一个匹配项的对象名称组成。所有id都将放在int数组中,该数组将作为方法调用的参数传递。我假设schoolidclassidint,如果您需要它们作为字符串,请删除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);

      }
}