查找具有特定属性值的类

时间:2016-01-23 08:04:34

标签: c# class

考虑我有这些课程

class BaseClass
{
    public int Variable {get; set;}
}
class Class1:BaseClass
{
    public Class1()
    {
        Variable=1;
    }
}
class Class2:BaseClass
{
    public Class2()
    {
        Variable=2;
    }
}

在另一个地方,我想这样做:

public BaseClass MyMethod(int i)
{
    //I want if i is 1 this method returns Class1
    //And if i is 2 this method returns Class2.
}

解决方案是使用switch语句。但是我的命名空间有很多类,并且使用switch会产生很多代码行。

2 个答案:

答案 0 :(得分:2)

你的评论"但我的命名空间有很多类,并且使用switch结果很多代码行。"告诉我你做错了什么。

这是经典问题,可以通过工厂模式轻松解决,使用开关将是最佳解决方案:

switch(num) {
  case 1: return new Class1();
  case 2: return new Class2();
  default: throw new ArgumentException();
}

也许你应该拆分命名空间?

其他解决方案有点难看因为你将失去编译时检查,就是使用Activator:

return (BaseClass)Activator.CreateInstance("AssemblyName", "Class" + num)

根据评论,100个班级,必须选择一个。

public static class AmazingFactory {
    private static IDictionary<int, Type> _num2Type;

    private static void InitializeFactory() {
        var type = typeof(BaseClass);

        // get all subclasses of BaseClass 
        var types = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(s => s.GetTypes())
            .Where(p => type.IsAssignableFrom(p));

        foreach(var type in types) {
            int numberAtTheEnd = int.Parse(Regex.Match(type.Name, @"\d+$").Value);
            _num2Type[numberAtTheEnd] = type;
        }

    }

    public static BaseClass Create(int num) {
        if (_num2Type == null)
            InitializeFactory();

        return (BaseClass)Activator.CreateInstance(_num2Type[num]);
    }
}

答案 1 :(得分:0)

看起来你不想要返回一个类,而是一个类的实例。接下来的问题是你想从哪里获取你的对象?如果它们存储在某些集合中,如

items = new List<BaseClass>();
items.add(new Class1());
items.add(new Class2());

然后你可以写一些类似

的东西
public BaseClass MyMethod(int i)
{
   return items.First(item=>item.Variable == i);
}

如果您想在每次调用MyMethod时创建一个新实例,那么您必须使用switch\if(或使用Reflection,但这不是推荐的方法)

相关问题