0

DynamicObjectインスタンスが使用されるコンテキストに基づいて (動的クラスで) 異なる動作を取得するには、どのメソッドをオーバーライドする必要がありますか?

これが私が達成しようとしていることの例です:

class DynamicTest : DynamicObject
{
    public DynamicTest(string xyz)
    {
        _xyz = xyz;
    }

    private string _xyz;

    //TODO: what do I need to implement to get required behaviour?
}

class Program
{
    static void Main(string[] args)
    {
        dynamic foo = new DynamicTest("test);

        if (foo)  // treat foo as boolean
        { // jump in here when _xyz of foo has a value
            System.Console.WriteLine(foo); //treat foo as string
        }
        else
        { // jump in here when _xyz of foo is null
            System.Console.WriteLine("No Value In Object");
        }
    }
}
4

2 に答える 2

2

なぜこれを行おうとしているのかわかりません。絶対にお勧めしませんが、DynamicObjectのTryConvertメソッドを次のようにオーバーライドできます。

class DynamicTest : DynamicObject
{
    public DynamicTest(string xyz)
    {
        _xyz = xyz;
    }
    private string _xyz;


    public override bool TryConvert(ConvertBinder binder, out Object result)
    {
        Console.WriteLine ("TryConvert was called");
        Console.WriteLine ("Is explicit: "+binder.Explicit);
        if(binder.Type == typeof(bool))
        {
            result = true;
            return true;
        }
        else if(binder.Type == typeof(string))
        {   
            result = _xyz;
            return true;
        }

        result = null;
        return false;
    }

    public override string ToString()
    {
        return _xyz;
    }
}

ここで、いくつかの問題があります。ToStringに必要ですConsole.WriteLine。暗黙の変換が存在しない場合(WriteLineオーバーロードされているため)、変換を試みないため、を呼び出しますToString。暗黙的および明示的な変換をbool渡しますが、内部でfooを使用すると、-が取得されますRuntimeBinderException: Cannot implicitly convert type 'DynamicTest' to 'bool'

例:

dynamic foo = new DynamicTest("test:");
bool boolFoo = foo; //passes, TryConvert is called with `binder.Explicit` == false
bool boolFoo1 = (bool)foo; //passes, TryConvert is called with `binder.Explicit` == true
if(foo) //throws RuntimeBinderException
于 2013-01-04T11:01:54.107 に答える
0

暗黙の演算子が役立つと思います

コード例:

class DynamicTest : DynamicObject
{
    public DynamicTest(string xyz)
    {
        _xyz = xyz;
    }

    private string _xyz;

    public static implicit operator bool(DynamicTest rhs)
    {
        return rhs._xyz != null;
    }

    public static implicit operator string(DynamicTest rhs)
    {
        return rhs._xyz;

    }

    //TODO: what to override to get required behaviour
}



class Program
{
    static void Main(string[] args)
    {
        dynamic foo = new DynamicTest("test");


        if (foo)  // treat foo as boolean
        { // jump in here when _xyz of foo has a value
            System.Console.WriteLine((string)foo); //treat foo as string   //Importat: (string)foo to go operatorstring 
        }
        else
        { // jump in here when _xyz of foo is null
            System.Console.WriteLine("No Value In Object");
        }


    }
}
于 2013-01-04T11:56:03.983 に答える