如何将任何对象的类型分配给.NET泛型方法?

时间:2010-03-30 05:45:26

标签: c# generics

假设我已经创建了这样的方法

private void Test<t>(t str)
{

}

现在从另一种方法我称之为

private void BtnClick()
{
    string a = "";


    test<Here I Want To assign The Type what ever the type of 'a' is>();
}

我该怎么做?

3 个答案:

答案 0 :(得分:2)

好吧,如果a是一个字符串,你可以写:

Test<string>(a);

如果aint,您可以写:

Test<int>(a);

非常明显。如果您事先不知道a的类型,那意味着BtnClick应该是通用的,问题就会转移到BtnClick的来电者:

private void BtnClick<T>()
{
    T a = ...;


    Test<T>(a);
}

C#2.0及更高版本提供了类型推断,因此您不必指定类型:

Test(a);

答案 1 :(得分:1)

您只需调用传递a的函数作为参数。类型推断将决定a的T应该是什么。

static void Main()
{
    string temp = "blah";
    Test(temp);
    Console.Read();
}

private static void Test<T>(T input)
{
    Console.WriteLine(typeof(T).ToString());
} 

System.String将打印到控制台。

编辑:但是,是的,缺少类型推断,当您知道变量的类型时,您始终可以明确表示类型。 Test<string>(temp);

答案 2 :(得分:0)

在您的示例中,a始终为string,因此您只需使用Test<string>(a)Test(a)。但是,如果你的意思是某个Type实例悬挂在某个地方,那么你就会进入反思区域。请注意,这是有效的,但如果在紧密循环中使用,则速度很慢,因此请确保您了解性能方面;

        object arg = ...;
        MethodInfo method = typeof(YourType)
            .GetMethod("Test", BindingFlags.NonPublic | BindingFlags.Instance)
            .MakeGenericMethod(arg.GetType());
        method.Invoke(this, new object[] { arg });