选择和实例化C#类的正确方法取决于字符串值?

时间:2018-04-18 15:02:21

标签: c# design-patterns dynamic-programming

我有基类

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...
    }
}

2 个答案:

答案 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)

查看您在查询中解释的方案,您似乎可以使用工厂模式来满足您的要求。