创建一个实现我的自定义接口的动态对象

时间:2018-04-09 09:24:39

标签: c# dynamic interface dynamicobject

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

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

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

我的API有这个签名:

void DoWork(MyDynamicEntity myEntity);

一切“看起来”都有效,但问题是intellisense不能帮助程序员(不是我)如何使用我的API ....事实上,使用api他们必须写下这样的东西:

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

他们必须声明dynamic类型的对象,因此使用API​​的人无法看到存在两个必需的道具:KeyType ..

任何人都可以提出如何解决我的问题的建议吗? 感谢名单

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

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

我正在寻找一种易于记忆的解决方案,对于我必须使用我的API的人来说很容易理解,所以我不需要向大家解释他们与API有什么关系。

1 个答案:

答案 0 :(得分:1)

您可以分割动态和非动态属性,如下所示:

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