近日在给一个系统类增加扩展方法的时候发现定义的参数是 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);
}
}