質問

私はC#4.0の動的なオブジェクトモデルを試しています。

私はDynamicObjectから継承「ブロック」という名前の抽象クラスを作成しました。それはTryGetMemberとTrySetMemberを上書きします。

また私は「ブロック」から継承する「ブラシ」という名前の使用可能なクラスを作成しました。私はそれが動的に使用できるようにしたいです。

しかし、私はそれから動的オブジェクトを作成し、実行時バインドメンバーにアクセスしようとすると、それはメンバーが存在しないことを私に言って例外で私を毛皮。抽象親クラスのオーバーライドされTryGetMemberまたはTrySetMemberメソッドが呼び出さ取得されていません。

予想されるこの動作ですか

ありがとうございます!

役に立ちましたか?

解決

あなたは言うためにそのハードので、任意のコードを投稿していないが、ここで間違いなく作品のサンプルです。それは私が今日読んでいたものの修正版です。ホープは役立ちます。

namespace DynamicStuff
{
    public class Program
    {
        static void Main(string[] args)
        {
            dynamic brush = new Brush();
            brush.Handle = "Wooden";
            brush.Colour = "Red";

            Console.WriteLine(brush.Handle + " " + brush.Colour);
            Console.WriteLine(
                "Number of dynamic properties:" + brush.Count);

        }
    }

    public class Brush : Block
    {
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            Console.Out.WriteLine("About To call TryGetMember base");
            object res = null;
            bool retVal = base.TryGetMember(binder, out res);
            result = res;
            return retVal;
        }

        public override bool TrySetMember(System.Dynamic.SetMemberBinder binder, object value)
        {
            Console.Out.WriteLine("About to call TrySetMember base");
            return base.TrySetMember(binder, value);
        }
    }

    public abstract class Block : DynamicObject
    {
        private Dictionary<string, object> d = new Dictionary<string, object>();

        public int Count
        {
            get
            {
                return d.Count;
            }
        }


        public override bool TryGetMember(
            GetMemberBinder binder, out object result)
        {
            Console.Out.WriteLine("In TryGetMember in block");
            string name = binder.Name.ToLower();
            return d.TryGetValue(name, out result);
        }

        public override bool TrySetMember(
            SetMemberBinder binder, object value)
        {
            Console.Out.WriteLine("In TrySetMember in block");
            d[binder.Name.ToLower()] = value;
            return true;
        }

    }


}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top