我有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
}
}
这是最好的方法,我怎样才能避免反思而不必编写任何额外的代码?
答案 0 :(得分:4)
我不确定,但也许:
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无关的地方,然后根据该列表重新创建ComboBox内容)。
答案 1 :(得分:1)
查看Unity IoC(或任何其他可以从字符串解析的IoC):
来自IOC Container Runtime Resolution
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,请查看此问题中链接的链接