我有基类
public abstract class HostBehavior : SiteHost
{
public abstract List<string> ParseNews(string url);
}
许多派生类......
选择应该调用哪个构造函数的最佳方法取决于url?
现在我有很长的“if else”语句序列,例如:
public static HostBehavior ResolveHost(string url)
{
if (uri.IndexOf("stackoverflow.com") > 0)
{
return new stackoverflowBehavior();
}
else if(uri.IndexOf("google.com") > 0)
{
return new googleBehavior();
}
// and so on...
else
{
throw new Exception...
}
}
答案 0 :(得分:1)
我决定给每个班级一个自定义attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct)]
public class HostAttribute : System.Attribute
{
public string name;
public HostAttribute(string name)
{
this.name = name;
}
}
所以我的课程看起来像
[Host("stackoverflow.com")]
public class stackoverflowBehavior : HostBehavior
{
//...
}
现在我可以从assembly&#39; s文件夹|命名空间
获取所有类Assembly asm = Assembly.GetExecutingAssembly();
Type[] hostTypes = asm.GetTypes()
.Where(a => a.IsClass && a.Namespace != null && a.Namespace.Contains(@"Hosts"))
.ToArray();
最后,我需要找到与传入url.Host相同的HostAttribute类型
foreach(Type t in hostTypes)
{
HostAttribute attribute = (HostAttribute)Attribute.GetCustomAttribute(t, typeof(HostAttribute));
if (attribute.name == url.Host)
return (HostBehavior)Activator.CreateInstance(t);
}
我要感谢所有人的引用,尤其是Ed Plunkett。
答案 1 :(得分:0)
查看您在查询中解释的方案,您似乎可以使用工厂模式来满足您的要求。