创建一个实现我的自定义界面的动态对象
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 的人不可见,存在两个必需的道具:Key
和 Type
。 .
任何人都可以建议如何解决我的问题吗?
谢谢
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 = ...;
我正在创建一些自定义 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 的人不可见,存在两个必需的道具:Key
和 Type
。 .
任何人都可以建议如何解决我的问题吗? 谢谢
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 = ...;