可能重复:
如何使用反射调用泛型方法?
我有一个带有以下签名的方法
public string Register<T>()
{
//code
}
可以像这样调用
var result = Register<Employee>()
;
我的要求是通过从配置文件中读取类型 T 来调用该方法,
即: 在调用时,我应该能够通过读取配置文件来动态提供它,而不是硬编码“Employee”。
关于如何做的任何想法?
可能重复:
如何使用反射调用泛型方法?
我有一个带有以下签名的方法
public string Register<T>()
{
//code
}
可以像这样调用
var result = Register<Employee>()
;
我的要求是通过从配置文件中读取类型 T 来调用该方法,
即: 在调用时,我应该能够通过读取配置文件来动态提供它,而不是硬编码“Employee”。
关于如何做的任何想法?
好吧,您可以使用反射,特别是MakeGenericMethod,但如果您在编译时没有类型,最好将方法签名更改为Register(Type type)
. 然后你可以从配置文件中读取类型并直接传入。
编辑
如果您添加对 的引用SimpleInjector.Extensions
,您将能够访问非通用注册方法。请参阅此处源中的NonGenericRegistrationsExtensions.cs。这将允许您执行以下操作:
string typeName = GetTypeNameFromConfigFile();
Type type = Type.GetType(typeName);
container.RegisterSingle(type, type); // register as self
那么你根本不需要泛型。
您可能还想阅读高级场景
编译时需要类型参数,因此为了做到这一点,您需要使用反射。
在 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>();
}