创建 Proxy/Mock 对象 From/Of 通用类型
Creating Proxy/Mock Object From/Of Generic Type
我想实现以下方法:
public static T CreateProxyObject<T>(Dictionary<String,Object> setup)
具有以下规则:
1) 我希望尽可能保持通用,这意味着 T 在编译期间是未知的,我希望能够 return 将其作为 mocked/proxy 请求的类型提供给用户(用户可以仍然使用普通的智能感知来获取对象的元数据。
2) 它应该具有所有属性 set/setup 基于设置字典:
String-> property name of the object
Object-> the return value for this property
任何其他方法都应该通过抛出未实现的异常来实现
我试图使用 T 的模拟(来自 Moq 框架),但 T 必须是引用类型。
使用 Castle DynamicProxy 和 RealProxy 也没有成功。
有什么想法吗?
试试城堡字典适配器
http://kozmic.net/2014/03/22/strongly-typed-app-settings-with-castle-dictionaryadapter/
多搜索后,我找到了 this answer that guided me to use impromptu-interface which uses expandoobject/dynamic object in order to implement an interface, And together with 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();
}
}
我想实现以下方法:
public static T CreateProxyObject<T>(Dictionary<String,Object> setup)
具有以下规则:
1) 我希望尽可能保持通用,这意味着 T 在编译期间是未知的,我希望能够 return 将其作为 mocked/proxy 请求的类型提供给用户(用户可以仍然使用普通的智能感知来获取对象的元数据。
2) 它应该具有所有属性 set/setup 基于设置字典:
String-> property name of the object
Object-> the return value for this property
任何其他方法都应该通过抛出未实现的异常来实现
我试图使用 T 的模拟(来自 Moq 框架),但 T 必须是引用类型。
使用 Castle DynamicProxy 和 RealProxy 也没有成功。
有什么想法吗?
试试城堡字典适配器 http://kozmic.net/2014/03/22/strongly-typed-app-settings-with-castle-dictionaryadapter/
多搜索后,我找到了 this answer that guided me to use impromptu-interface which uses expandoobject/dynamic object in order to implement an interface, And together with 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();
}
}