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; オブジェクトに等しい:真。
タイプは次のとおりです。System.Object; オブジェクトに等しい:真。

ジェネリックメソッド内で、型パラメーターが動的であるか通常のオブジェクトであるかをどのように判断できますか?

4

1 に答える 1

4

いいえ、あなたがすることはできません。動的はすべて見る人の目にあります(つまり、コンパイラー)。動的として実装されます。ただし、次のことを確認できIDynamicMetaObjectProviderます。オブジェクトがそれを実装している場合、呼び出し元はおそらくについて話しているでしょうdynamic。残念ながら、リフレクションは内部dynamicでも機能しますが、まったく関与IDynamicMetaObjectProviderしません。

于 2012-12-23T21:39:18.993 に答える