C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的應用(上)

來源:互聯網
上載者:User

ExpandoObject:表示一個對象,該對象包含可在運行時動態添加和移除的成員。

複製代碼 代碼如下:dynamic dynEO = new ExpandoObject();
dynEO.number = 10;
dynEO.Increment = new Action(() => { dynEO.number++; });

Console.WriteLine(dynEO.number);
dynEO.Increment();
Console.WriteLine(dynEO.number);

dynEO.number 中number是動態添加屬性。

dynEO.Increment 中Increment 是動態添加的Action 委託。

枚舉ExpandoObject的所有成員:

複製代碼 代碼如下:foreach (var property in (IDictionary<String, Object>)dynEO)
{
Console.WriteLine(property.Key + ": " + property.Value);
}

結果如下:

接收屬性更改的通知:

複製代碼 代碼如下:static void Main(string[] args)
{
………
((INotifyPropertyChanged)dynEO).PropertyChanged += new PropertyChangedEventHandler(Program_PropertyChanged);
dynEO.Name = "changed";
dynEO.Name = "another";

Console.ReadLine();
}

static void Program_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine("屬性{0} 已更改", e.PropertyName);
}

結果:

System.Dynamic.DynamicObject:提供用於指定運行時的動態行為的基類

建立類DynamicProduct,基本和Product類似:

可以看到繼承了DynamicObject後,可以override 一大堆TryXXX的方法了。

重點需要瞭解的是:

假設sampleObject 就是dynamicObject

TryGetMember

在調用 int number = sampleObject.Number.時使用

TrySetMember

在調用sampleObject.Number = number 時使用

TryInvoke

在調用sampleObject(100) 時使用

TryInvokeMember

在調用sampleObject.someMethod(100) 時使用

完整的代碼如下:

複製代碼 代碼如下:class DynamicProduct : DynamicObject
{
public string name;
public int Id { get; set; }

public void ShowProduct()
{
Console.WriteLine("Id={0} ,Name={1}", Id, name);
}

#region Override DynamicObject 的方法

public override IEnumerable<string> GetDynamicMemberNames()
{
return base.GetDynamicMemberNames();
}

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
Console.WriteLine("TryGetMember被調用了,Name:{0}", binder.Name);
return base.TryGetMember(binder, out result);
}

public override bool TrySetMember(SetMemberBinder binder, object value)
{
Console.WriteLine("TrySetMember被調用了,Name:{0}", binder.Name);
return base.TrySetMember(binder, value);
}

public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
{
Console.WriteLine("TryInvoke被調用了");
return base.TryInvoke(binder, args, out result);
}

public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
Console.WriteLine("TryInvokeMember被調用了,Name:{0}", binder.Name);
return base.TryInvokeMember(binder, args, out result);
}

#endregion
}

Main函數代碼如下:複製代碼 代碼如下:static void Main(string[] args)
{
dynamic dynProduct = new DynamicProduct();

dynProduct.name = "n1"; //調用TrySetMember方法
dynProduct.Id = 1;
dynProduct.Id = dynProduct.Id + 3;
dynProduct.ShowProduct();

Console.ReadLine();
}

結果如下:

理論上來說,應該輸出:

TrySetMember :設定name欄位

TrySetMember :設定Id屬性

TryGetMember :擷取Id屬性

TrySetMember :設定Id屬性

TryInvokeMember :調用ShowProduct方法

Id =4 ,Name = n1

為什麼TryXXX方法沒有被調用??

下篇將解釋這個問題,請持續關注..

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.