【问题标题】:How to know if the type parameter is dynamic?如何知道类型参数是否是动态的?
【发布时间】:2012-12-23 21:22:03
【问题描述】:

似乎每次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;等于对象:真。
类型为:System.Object;等于对象:真。

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

【问题讨论】:

    标签: c# generics dynamic


    【解决方案1】:

    不,你不能。动态的一切都在旁观者的眼中(意思是:编译器)。它实现为动态的。但是,您可以检查IDynamicMetaObjectProvider:如果一个对象实现了它,那么调用者可能正在谈论dynamic。不幸的是,反射也可以在dynamic 内部工作,但根本不会涉及IDynamicMetaObjectProvider

    【讨论】:

    • 谢谢。顺便说一句,如果有一个泛型类型的参数传递给该方法,IDynamicMetaObjectProvider 将很有用。在我的示例中,只有返回值使用泛型类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多