c#更简单的运行时泛型

本文关键字:泛型 运行时 更简单 | 更新日期: 2023-09-27 18:15:31

是否有一种方法可以调用只有在运行时才知道类型的泛型函数?

我想做的是:

    static  void bar()
    {
        object b = 6;
        string c = foo<typeof(b)>();
    }
    static  string foo<T>()
    {
       return typeof (T).Name;
    }

基本上我只想在运行时决定类型参数,但是我调用的函数取决于类型参数。

我也知道这可以通过反射来完成…但这不是解决问题的最好办法……


我正在寻找c#中的动态特性…


我在两个类之间构建一个桥梁,第一个类基本上是一个包含不同类型对象(通过接口组合)的大树,另一个是一种"超级访问者"。晚餐访问者接受键值字典,将类型映射到对象:dic。添加(对象值)

和T不一定是值的类型…很多时候都不是……我知道写得很糟糕,但我无法修改……我可以绕过它,但只能在运行时…

我已经用反思做过了,但如果有更好的方法不用反思,我很乐意学习…

谢谢

c#更简单的运行时泛型

这是一个hack,但你可以让dynamic为你做反射的工作,如

class Program
{
    static void Main(string[] args)
    {
        var b = 6;
        var t = (dynamic)new T();
        var n = t.Foo(b);
    }
    class T
    {
        public string Foo<T>(T a)
        {
            return typeof(T).Name;
        }
    }
}

这里,动态调用将提取b的类型,并将其用作Foo()的类型参数。

如果你使用。net 4,你可以使用dynamic关键字。总之,变量的类型将在运行时解析,因此它是一个超泛型类型;)你可以在这里阅读文章或者阅读MSDN文档

反思是问题的解决方案,它是好是坏在这里无关紧要。正是运行时设计的机制实现了这一点。由于没有参数或泛型可以用作输入,这是唯一的方法——这也是毫无意义的。比如:你的榜样不好。因为在示例中,类型是硬编码的。

如果b存在的方法有b作为泛型形参,则该类型可传递给foo。如果没有,反射是最好的选择,尽管语法看起来很笨拙。不过只有一次。

我相信这是唯一的方法:

 var foo =  typeof(Foo<>).MakeGenericType(typeof (bar));

您可以设置一个类,在运行时接受类型参数,该类型参数可用于该类中的方法。

public class GenericClass<T>()
{
    ICommonInterface TheObject;
    public GenericClass(T theObject)
    {
         TheObject = theObject;
    }

    public string GetName()
    {
        return TheObject.Name;
    }
}

但是这只有在共享接口中传递的类型之间具有共同属性时才真正有用。在您的示例中,似乎反射是答案,这取决于您想要访问特定属性的类型。