【问题标题】:Creating Proxy/Mock Object From/Of Generic Type从/从通用类型创建代理/模拟对象
【发布时间】:2017-06-11 18:03:17
【问题描述】:

我想实现以下方法:

public static T CreateProxyObject<T>(Dictionary<String,Object> setup) 

遵循以下规则:

1) 我想尽可能保持通用意味着 T 在编译期间是未知的,我希望能够将它作为模拟/代理请求的类型返回给用户(用户仍然可以使用普通的智能感知来获取对象的元数据)。

2) 它应该根据设置字典设置/设置其所有属性:

String-> property name of the object

Object-> the return value for this property

任何其他方法都应该通过抛出未实现的异常来实现

我试图使用 T 的模拟(来自 Moq 框架),但 T 必须是引用类型。

Castle DynamicProxy 和 RealProxy 也没有成功。

有什么想法吗?

【问题讨论】:

    标签: c# generics mocking proxy-classes expandoobject


    【解决方案1】:

    【讨论】:

    【解决方案2】:

    经过一番搜索,我找到了this 答案,它指导我使用impromptu-interface,它使用扩展对象/动态对象来实现接口,并与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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-25
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多