【问题标题】:Reading type <T> from config [duplicate]从配置中读取类型 <T> [重复]
【发布时间】:2012-09-18 21:34:29
【问题描述】:

可能重复:
How to use reflection to call generic Method?

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

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

可以这样调用

var result = Register&lt;Employee&gt;();

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

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

你知道怎么做吗?

【问题讨论】:

  • 这是否有机会注册 DI 容器?大多数 DI 容器都内置了配置文件功能。
  • @default.kramer: 是的,你找到我了,我正在使用没有基于 xml 的配置的 simpleinjector

标签: c# generics


【解决方案1】:

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

编辑

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

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

那么你根本不需要泛型。

您可能还想阅读Advanced Scenarios

【讨论】:

  • kramer :成功了,感谢您的详细分析,您节省了我的时间。
【解决方案2】:

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

How do I use reflection to call a generic method?

【讨论】:

    【解决方案3】:

    在 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>();
    }
    

    【讨论】:

    • 得到错误“找不到类型或命名空间名称'obj'(您是否缺少 using 指令或程序集引用?)”..,但我正在寻找这样的解决方案..
    • @BrazilNut 我编辑了我的答案。检查 web.config 部分
    • 这仍然无法编译,因为objType 的实例,而不是编译时类型参数。检查 dwerner 的答案以了解您要执行的操作。
    • @BrazilNut 你能试试这个吗?更新了代码。
    • @Nathan :由于上述“default.kramer”提到的原因,它仍然不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多