如何确定类型参数是否为dynamic?

4

似乎每次调用泛型方法时,如果调用者使用了dynamic关键字,则实际使用的类型是简单的object。例如:

public static void Main()
{
    Program.DoSomething<int>();
    Program.DoSomething<object>();
    Program.DoSomething<dynamic>();

    Console.WriteLine("Press any key to continue...");
    Console.ReadKey(true);
}

public static T DoSomething<T>() where T : new()
{
    Console.WriteLine(
        "The type is: {0}; equal to object: {1}.",
        typeof(T).FullName,
        typeof(T) == typeof(object));

    dynamic result = new ExpandoObject();
    result.Hello = "Hello";
    result.Number = 123;

    try
    {
        return (T)result;
    }
    catch (Exception)
    {
        Console.WriteLine("Can't cast dynamic to the generic type.");
        return new T();
    }
}

产生的结果:

类型是:System.Int32;等于对象:False。
无法将动态类型转换为泛型类型。
类型是:System.Object;等于对象:True。
类型是:System.Object;等于对象:True。

如何在泛型方法中确定类型参数是动态类型还是普通对象?

1个回答

4
不,你不能。"动态"是由编译器确定的,它被实现为动态。但是,你可以检查IDynamicMetaObjectProvider:如果一个对象实现了这个接口,调用者可能在谈论dynamic。不幸的是,反射也可以在dynamic内部工作,但根本不涉及IDynamicMetaObjectProvider。

1
谢谢。顺便说一下,如果方法中有一个泛型类型的参数传递,IDynamicMetaObjectProvider会很有用。在我的例子中,只有返回值使用了泛型类型。 - Arseni Mourzenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接