所以..我有一个对象创建模式的问题。
我有多个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);
}
}
答案 0 :(得分:0)
您可能需要Reflection,这将允许您动态调用方法,GetSchool
,GetClass
或其他任何方法。您可以查看此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
数组中,该数组将作为方法调用的参数传递。我假设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);
}
}