避免反思

  • 本文关键字: c# reflection
  • 更新时间 :
  • 英文 :


我有81个实现接口的类(仍在增长),我有一个类的属性表示该接口,例如:

public wrapper
{
   public Imyinterface instance{get;set;}
   public wrapper(string theNameOfTheClass)
   {
    instance = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(theNameOfTheClass);
    instance.Run(); //the interface has a run method
   }
}

这是最好的方法吗?我如何避免反思,而不必写任何额外的代码?

我不确定,但可能:

public Wrapper<T>
   where T : IMyInterface, new()
{
    public IMyInstance instance { get; set; }
    public Wrapper()
    {
        instance = new T();
        instance.Run();
    }
}

像一样使用

Wrapper<SomeClass> wrapper = new Wrapper<SomeClass>();

如果你想把包装器放在某种列表上,只需从通用的非泛型类中派生它们:

public abstract class BaseWrapper
{
}
public class Wrapper<T> : BaseWrapper
...

编辑:回应评论

也许问题不在包装类中。若您从用户那里得到一个字符串,则只有两个选项:一个巨大的开关或反射。

例如,您可以更改ListBox的内容:

public class ComboBoxItem
{
    public string Title { get; set; }
    public Func<IMyInterface> creator { get; set; }        
    public override string ToString()
    {
        return Title;
    }
}

现在创建这些项目的列表并将其传递到ComboBox:

var items = new[] {
    new ComboBoxItem { Title = "First class", creator = () => new FirstClass() },
    new ComboBoxItem { Title = "Second class", creator = () => new SecondClass() },
}

无论如何,您都必须填充该组合框,因此将有一些硬编码。重点是只在一个地方硬编码类列表(甚至可能在与ComboBox无关的地方,然后根据该列表重新创建ComboBox内容)。

看看Unity IoC(或任何其他可以从字符串解析的IoC):

来自IOC容器运行时分辨率

string typeName = "MyTypeName";
var type = container.Registrations.FirstOrDefault(r => r.RegisteredType.Name == typeName);
if(type != null)
{
    var resolvedInstance = container.Resolve(type.RegisteredType);
}

编辑:对于Convention over Configuration,请查看此问题中链接处的链接

使用最小配置的Unity

相关内容

  • 没有找到相关文章

最新更新