C# 扩展方法中定义参数应用强类型参数后,dynamic 类型的参数无法直接应用的问题

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

        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章