C# 创建实现自定义接口的动态对象

C# 创建实现自定义接口的动态对象,c#,dynamic,interface,dynamicobject,C#,Dynamic,Interface,Dynamicobject,我正在创建一些自定义API。我需要的是向api传递一些对象,这些对象具有“静态”必需的属性和动态可选属性 我创建了一个动态自定义对象,如下所示: public class MyDynamicEntity : DynamicObject, IMyDynamicEntity { public string Key { get; set; } public string Type { get; set; } } dynamic myEntity = new MyDynamicEnti

我正在创建一些自定义API。我需要的是向api传递一些对象,这些对象具有“静态”必需的属性和动态可选属性

我创建了一个动态自定义对象,如下所示:

public class MyDynamicEntity : DynamicObject, IMyDynamicEntity
{
    public string Key { get; set; }
    public string Type { get; set; }
}
dynamic myEntity = new MyDynamicEntity();
myEntity.DynamicPropA = ...;
myEntity.DynamicPropB = ...;
...
myEntity.Key = ...;
myEntity.Type = ...;
interface IMyDynamicEntity {
    string Key { get; set; }
    string Type { get; set; }
}

public class MyEntity : IMyDynamicEntity
{        
    public string Key { get; set; }
    public string Type { get; set; }
    public dynamic Properties { get; } = new MyDynamicProperties();

    private class MyDynamicProperties : DynamicObject {

    }
}
我的API有以下签名:

void DoWork(MyDynamicEntity myEntity);
一切“似乎”都能工作,但问题是intellisense不能帮助程序员(不是我)如何使用我的API。。。。实际上,要使用api,他们必须编写如下内容:

public class MyDynamicEntity : DynamicObject, IMyDynamicEntity
{
    public string Key { get; set; }
    public string Type { get; set; }
}
dynamic myEntity = new MyDynamicEntity();
myEntity.DynamicPropA = ...;
myEntity.DynamicPropB = ...;
...
myEntity.Key = ...;
myEntity.Type = ...;
interface IMyDynamicEntity {
    string Key { get; set; }
    string Type { get; set; }
}

public class MyEntity : IMyDynamicEntity
{        
    public string Key { get; set; }
    public string Type { get; set; }
    public dynamic Properties { get; } = new MyDynamicProperties();

    private class MyDynamicProperties : DynamicObject {

    }
}
他们必须声明类型为
dynamic
的对象,因此使用API的人看不到该对象。存在两个必需的道具:
类型

谁能给我一个解决问题的建议吗? 塔克斯

注:由于某些原因,我不能简单地创建一些实现我的
imydynamiceentity
接口的类

确切地说,我必须在我的
MyDynamicEntity
类和严格“Azure边界”类之间创建映射:
Microsoft.WindowsAzure.Storage.Table.DynamicTableEntity
(或
Microsoft.WindowsAzure.Storage.Table.TableEntity
)。 但我的API必须是通用的,而不是特定于用例的。 此外,我的API不能公开
DynamicTableEntity
(或
TableEntity
或继承其中一个的自定义类),否则使用我的API的客户端将导入Azure DLL


我正在寻找一种解决方案,在某些方面对我来说很容易记住,并且对于必须使用我的API的人来说也很容易理解,所以我不需要向每个人解释他们与API的关系

您可以像这样拆分动态和非动态属性:

public class MyDynamicEntity : DynamicObject, IMyDynamicEntity
{
    public string Key { get; set; }
    public string Type { get; set; }
}
dynamic myEntity = new MyDynamicEntity();
myEntity.DynamicPropA = ...;
myEntity.DynamicPropB = ...;
...
myEntity.Key = ...;
myEntity.Type = ...;
interface IMyDynamicEntity {
    string Key { get; set; }
    string Type { get; set; }
}

public class MyEntity : IMyDynamicEntity
{        
    public string Key { get; set; }
    public string Type { get; set; }
    public dynamic Properties { get; } = new MyDynamicProperties();

    private class MyDynamicProperties : DynamicObject {

    }
}
然后用法变成:

var myEntity = new MyEntity();
myEntity.Properties.DynamicPropA = ...;
myEntity.Properties.DynamicPropB = ...;                
myEntity.Key = ...;
myEntity.Type = ...;
dynamic myEntity = new MyDynamicEntity(key, type);
myEntity.DynamicPropA = ...;
myEntity.DynamicPropB = ...;
或者,在构造函数中要求“必需”属性:

public class MyDynamicEntity : DynamicObject, IMyDynamicEntity
{
    public MyDynamicEntity(string key, string type) {
        Key = key;
        Type = type;
    }
    public string Key { get; }
    public string Type { get; }
}
然后用法变成:

var myEntity = new MyEntity();
myEntity.Properties.DynamicPropA = ...;
myEntity.Properties.DynamicPropB = ...;                
myEntity.Key = ...;
myEntity.Type = ...;
dynamic myEntity = new MyDynamicEntity(key, type);
myEntity.DynamicPropA = ...;
myEntity.DynamicPropB = ...;

由于一些原因
这些原因是什么?这似乎是泛型的工作。如果它是一个接口而不是一个超类,那么您仍然需要在实际的类中实现它。这项
DoWork
要求的确切来源是什么?我扩展了我的“PS”,解释了让我选择动态对象作为可能解决方案的原因