我正在创建一些自定义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的人无法看到存在两个必需的道具:Key
和Type
..
任何人都可以提出如何解决我的问题的建议吗? 感谢名单
PS。:由于某些原因,我不能简单地创建一些实现我的IMyDynamicEntity
接口的类......
确切地说,我必须在我的MyDynamicEntity
类和严格“Azure-bounded”类之间创建映射:Microsoft.WindowsAzure.Storage.Table.DynamicTableEntity
(或Microsoft.WindowsAzure.Storage.Table.TableEntity
)。
但我的API必须是通用的,而不是特定于用例。
此外,我的API无法公开DynamicTableEntity
(或TableEntity
或继承其中一个的自定义类),否则使用我的API的客户端将导入Azure DLL。
我正在寻找一种易于记忆的解决方案,对于我必须使用我的API的人来说很容易理解,所以我不需要向大家解释他们与API有什么关系。
答案 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 = ...;