C# 创建实现自定义接口的动态对象
我正在创建一些自定义API。我需要的是向api传递一些对象,这些对象具有“静态”必需的属性和动态可选属性 我创建了一个动态自定义对象,如下所示: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
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”,解释了让我选择动态对象作为可能解决方案的原因