Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 发现泛型类型_C#_Generics_Reflection - Fatal编程技术网

C# 发现泛型类型

C# 发现泛型类型,c#,generics,reflection,C#,Generics,Reflection,感谢@dtb的帮助,他建议您确实需要一段通用服务定位器的代码 static class Locator { private static class LocatorEntry<T> where T : ... { public static IDataManager<T> instance; } public static void Register<T>(IDataManager<T> insta

感谢@dtb的帮助,他建议您确实需要一段通用服务定位器的代码

static class Locator
{
    private static class LocatorEntry<T> where T : ...
    {
        public static IDataManager<T> instance;
    }

    public static void Register<T>(IDataManager<T> instance) where T : ...
    {
        LocatorEntry<T>.instance = instance;
    }

    public static IDataManager<T> GetInstance<T>() where T : ...
    {
        return LocatorEntry<T>.instance;
    }
}

您需要使用反射调用
Register
,如下所示:

typeof(Locator)
    .GetMethod("Register")
    .MakeGenericMethod(type)
    .Invoke(null, manager);

您需要使用反射调用
Register
,如下所示:

typeof(Locator)
    .GetMethod("Register")
    .MakeGenericMethod(type)
    .Invoke(null, manager);

@SLaks:谢谢,但是我需要为
MakeGenericMethod
提供类型
T
,以及如何从我的类型中获得它,它是
BaseDataManager
的子类型?这是由
MakeGenericMethod
完成的。在我看来,两个小型强制转换比使用反射注册类型要简单得多@dtb:但如果我发现有反射的类型,我只会做一次这种疯狂的事情,比如说在静态构造函数中,否则每次我都会在询问定位器时使用强制转换。从另一方面来说,当我有非泛型接口并且习惯于到处使用casts时,我的旧方法要好得多,因为方法是非泛型的…@dtb:对于你的第二个代码片段,我需要同样的反射来注册实例,不是吗?@SLaks:谢谢,但是我需要为
MakeGenericMethod
提供类型
T
,以及如何从我的类型中获取它,它是
BaseDataManager
的子类型?这是由
MakeGenericMethod
完成的。在我看来,两个小型强制转换比使用反射注册类型要简单得多@dtb:但如果我发现有反射的类型,我只会做一次这种疯狂的事情,比如说在静态构造函数中,否则每次我都会在询问定位器时使用强制转换。从另一方面来说,当我有非泛型接口并且在任何地方都使用casts时,我的旧方法要好得多,因为方法是非泛型的…@dtb:对于你的第二个代码片段,我需要相同的反射来注册实例,不是吗?
typeof(Locator)
    .GetMethod("Register")
    .MakeGenericMethod(type)
    .Invoke(null, manager);