Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 阅读类型<;T>;从配置_C#_Generics - Fatal编程技术网

C# 阅读类型<;T>;从配置

C# 阅读类型<;T>;从配置,c#,generics,C#,Generics,可能重复: 我有一个签名如下的方法 public string Register<T>() { //code } 公共字符串寄存器() { //代码 } 可以这样调用 var result=Register() 我的要求是通过从配置文件中读取类型T来调用该方法 即: 在调用时,我应该能够通过读取配置文件动态地提供它,而不是硬编码“Employee” 你知道怎么做吗?编译时需要类型参数,所以为了做到这一点,你需要使用反射 编译时需要类型参数,因此为了做到这一点,您需要使用反射

可能重复:

我有一个签名如下的方法

public string Register<T>()
{
  //code
}
公共字符串寄存器()
{
//代码
}
可以这样调用

var result=Register()

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

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


你知道怎么做吗?

编译时需要类型参数,所以为了做到这一点,你需要使用反射


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


您可以使用反射,但如果在编译时没有类型,则最好将方法签名更改为
寄存器(类型)
。然后,您可以从配置文件中读取类型并直接将其传入

编辑

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

string typeName = GetTypeNameFromConfigFile();
Type type = Type.GetType(typeName);
container.RegisterSingle(type, type); // register as self
那么你根本不需要泛型


您可能还想仔细阅读您可以使用反射,但如果在编译时没有类型,则最好将方法签名更改为
寄存器(类型)
。然后,您可以从配置文件中读取类型并直接将其传入

编辑

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

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(字符串[]args)
{
Type obj=Type.GetType(ConfigurationManager.AppSettings[“DefaultType”]);
ConstructorInfo constructor=obj.GetConstructor(新类型[]{});
var myinstance=constructor.Invoke(null);
var result=寄存器();
}
在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(字符串[]args)
{
Type obj=Type.GetType(ConfigurationManager.AppSettings[“DefaultType”]);
ConstructorInfo constructor=obj.GetConstructor(新类型[]{});
var myinstance=constructor.Invoke(null);
var result=寄存器();
}

getting Error“找不到类型或命名空间名称'obj'(是否缺少using指令或程序集引用?)”,但我正在寻找类似这样的解决方案。@BrazilNut我编辑了我的答案。检查web.config部分这仍然不会编译,因为
obj
Type
的实例,而不是编译时类型参数。检查德韦纳的答案,看看你想做什么。@BrazilNut你能试试这个吗?更新的代码。@Nathan:由于上面的原因“default.kramer”提到设置错误“找不到类型或命名空间名称'obj'(您是否缺少using指令或程序集引用?)”,它仍然不起作用。但我正在寻找这样的解决方案。@BrazilNut我编辑了我的答案。检查web.config部分这仍然不会编译,因为
obj
Type
的实例,而不是编译时类型参数。检查德韦纳的答案,看看你想做什么。@BrazilNut你能试试这个吗?更新的代码。@Nathan:由于上面的原因,“default.kramer”提到了DI容器注册的可能性,它仍然不起作用?大多数DI容器都内置了配置文件功能。@default.kramer:是的,我使用的是simpleinjector,没有基于xml的配置。这是DI容器注册的机会吗?大多数DI容器都内置了配置文件功能。@default.kramer:是的,我使用的是simpleinjector,没有基于xml的配置kramer:它成功了,感谢您的详细分析,您节省了我的时间。kramer:成功了,感谢您的详细分析,您节省了我的时间。