创建一个实现我的自定义界面的动态对象

Create a dynamic object that implements my custom interface

我正在创建一些自定义 API。我需要的是将一些对象传递给具有 "static" 必需属性和动态可选属性的 api。

我创建了一个这样的动态自定义对象:

public class MyDynamicEntity : DynamicObject, IMyDynamicEntity
{
    public string Key { get; set; }
    public string Type { get; set; }
}

我的 API 有这个签名:

void DoWork(MyDynamicEntity myEntity);

一切 "seems" 工作,但问题是智能感知不帮助程序员(不是我)如何使用我的 API.... 事实上使用 api 他们必须这样写:

dynamic myEntity = new MyDynamicEntity();
myEntity.DynamicPropA = ...;
myEntity.DynamicPropB = ...;
...
myEntity.Key = ...;
myEntity.Type = ...;

他们必须声明类型为 dynamic 的对象,因此使用 API 的人不可见,存在两个必需的道具:KeyType。 .

任何人都可以建议如何解决我的问题吗? 谢谢

PS.: 由于某些原因,我不能简单地创建一些实现我的 IMyDynamicEntity 接口的 classes...

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

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

您可以像这样拆分动态和 non-dynamic 属性:

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 = ...;

或者,在构造函数中需要 "required" 个属性:

public class MyDynamicEntity : DynamicObject, IMyDynamicEntity
{
    public MyDynamicEntity(string key, string type) {
        Key = key;
        Type = type;
    }
    public string Key { get; }
    public string Type { get; }
}

然后用法变为:

dynamic myEntity = new MyDynamicEntity(key, type);
myEntity.DynamicPropA = ...;
myEntity.DynamicPropB = ...;