0

可能重复:
如何使用反射调用泛型方法?

我有一个带有以下签名的方法

public string Register<T>()
{
  //code
}

可以像这样调用

var result = Register<Employee>();

我的要求是通过从配置文件中读取类型 T 来调用该方法,

即: 在调用时,我应该能够通过读取配置文件来动态提供它,而不是硬编码“Employee”。

关于如何做的任何想法?

4

3 回答 3

2

好吧,您可以使用反射,特别是MakeGenericMethod,但如果您在编译时没有类型,最好将方法签名更改为Register(Type type). 然后你可以从配置文件中读取类型并直接传入。

编辑

如果您添加对 的引用SimpleInjector.Extensions,您将能够访问非通用注册方法。请参阅此处源中的NonGenericRegistrationsExtensions.cs。这将允许您执行以下操作:

string typeName = GetTypeNameFromConfigFile();
Type type = Type.GetType(typeName);
container.RegisterSingle(type, type); // register as self

那么你根本不需要泛型。

您可能还想阅读高级场景

于 2012-09-18T21:40:40.360 回答
1

编译时需要类型参数,因此为了做到这一点,您需要使用反射。

如何使用反射调用泛型方法?

于 2012-09-18T21:37:41.023 回答
0

在 web.config 上

<appSettings>
<!-- The assembly name of the default type. Use the format Fully.Qualified.Class.Name, Assembly.FileName -->
<add key="DefaultType" value="MyTestApp.BusinessEntitites.Employee, MyTestApp.BusinessEntitites " />
</appSettings>

在 C# 上:

static void Main(string[] args)
{
    Type obj = Type.GetType(ConfigurationManager.AppSettings["DefaultType"]);
    ConstructorInfo constructor = obj.GetConstructor(new Type[] { });
    var myinstance = constructor.Invoke(null);
    var result = Register<myinstance>();
}
于 2012-09-18T21:42:44.843 回答