我想实现以下方法:
public static T CreateProxyObject<T>(Dictionary<String,Object> setup)
遵守以下规则:
1)我希望尽可能保持通用意味着在编译期间不知道T并且我希望能够将其作为模拟/代理请求类型返回给用户(用户仍然可以使用正常的intellisense来获取对象&# 39; s元数据)。
2)它应该根据设置字典设置/设置所有属性:
String-> property name of the object
Object-> the return value for this property
任何其他方法都应该通过抛出未实现的异常来实现
我试图使用模拟T(来自Moq框架),但T必须是引用类型。
使用Castle DynamicProxy和RealProxy也没有成功。
任何想法?
答案 0 :(得分:0)
答案 1 :(得分:0)
在搜索了一下后,我发现了this回答,引导我使用impromptu-interface使用expandoobject / dynamic对象来实现接口,并与this回答一起使用解决动态设置属性的问题),
我能够创建以下实现:
public static T CreateProxyObject<T>(Dictionary<String,Object> setup) where T : class
{
return setup.Aggregate(
(IDictionary<string, object>) new ExpandoObject(),
(e, kvSetup) =>
{
e.Add(kvSetup.Key, kvSetup.Value);
return e;
}).ActLike<T>();
}
可以这样使用:
public interface IPerson
{
string Name { get; set; }
int Age { get; set; }
void Method();
}
public class Program
{
static void Main(string[] args)
{
//Dynamic Expando object
var p = CreateProxyObject<IPerson>(new Dictionary<string, object>
{
{"Name", "a name"},
{"Age", 13}
});
var n = p.Name;
var a = p.Age;
//Throws: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Method'
p.Method();
}
}