近日在給一個系統類增加擴展方法的時候發現定義的參數是 string 類型,然後從 json 讀取數據到 dynamic 類型後,必須轉義一下類型,否則擴展方法的類型則不像其他方法一樣可以自動識別。
寫了些測試代碼確定有此問題,當然這也是好的,起碼能保證數據類型是可靠的。
提示信息:嚴重性 代碼 說明 項目 文件 行 禁止顯示狀態
錯誤 CS1973 “Person”不具有名爲“SetId”的適用方法,但是似乎有該名稱的擴展方法。無法動態調度擴展方法。請考慮強制轉換動態參數或在不使用擴展方法語法的情況下調用擴展方法。 UnitTestProject1 F:\代碼\公司代碼\DFVS\ATIAN-Project-DFVS-00001\platform_demo\src\UnitTestProject1\UnitTest1.cs 71 活動的
測試樣例代碼:
public class Person
{
private string name;
private Guid guid;
public void SetName(string name)
{
this.name = name;
}
public string GetName()
{
return this.name;
}
public void SetGuid(Guid guid)
{
this.guid = guid;
}
public Guid GetGuid()
{
return this.guid;
}
}
public static class PersonExtension
{
private static Guid _Id;
public static void SetId(this Person person, Guid id)
{
_Id = id;
}
public static Guid GetId(this Person person)
{
return _Id;
}
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
dynamic personEntity = new { Id = Guid.NewGuid(), Name = "XBodhi" };
Person person = new Person();
person.SetName("XBodhi");
string name = person.GetName();
//SetId 方法爲附加方法
//錯誤的方式
person.SetId(personEntity.Id);
//正確的方式
person.SetId((Guid)personEntity.Id);
Guid id = person.GetId();
//SetGuid 爲非附加方法
//可直接使用 dynamic 類型的值不需要轉義
person.SetGuid(personEntity.Id);
//轉換的方式也可以
person.SetGuid((Guid)personEntity.Id);
}
}