创建 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();
    }
}