基于动态实例化在运行时访问类属性

时间:2014-02-05 00:23:31

标签: c#

我有以下课程:

public Employee : IPerson
{
  public string Name { get; set; }
}

public Manager : IPerson
{
  public string Name { get; set; }
}

在运行时,我可能需要:

var person = new Manager();

或可能:

var person = new Employee();

然后:

string name = person.Name;

在某个时候。我目前正在使用Activator.CreateInstance(),但是想知道是否错误地接近了这个问题?类的类型是在运行时决定的,所以没有高级注意事项。

我希望避免像:

string externalValue;
var person;

switch (externalValue)
{
  case "Manager":
    person = new Manager();
    break;
  case "Employee":
    person = new Employee();
    break;
}

2 个答案:

答案 0 :(得分:1)

您可以使用Dictionary<string, Func<IPerson>>,初始化一次,然后使用创建正确的实例:

private Dictionary<string, Func<IPerson>> _initializers = new Dictionary<string, Func<IPerson>>() {
    { "Manager", () => new Manager() },
    { "Employee", () => new Employee() }
}
string externalValue;
var person = _initializers[externalValue]();

答案 1 :(得分:1)

看起来您正在尝试创建依赖注入(DI)系统。

  

依赖注入是一种软件设计模式,允许删除硬编码的依赖项,并且可以在运行时或编译时更改它们

http://en.wikipedia.org/wiki/Dependency_injection

我建议您查看现有的DI系统,而不是重新发明轮子。有关概述,请查看

How do the major C# DI/IoC frameworks compare?