从通用类型

时间:2017-06-11 18:03:17

标签: c# generics mocking proxy-classes expandoobject

我想实现以下方法:

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也没有成功。

任何想法?

2 个答案:

答案 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();
    }
}