【问题标题】:Dynamically created Proxy a class动态创建的Proxy一个类
【发布时间】:2015-12-29 09:01:28
【问题描述】:

我正在运行时构建一个类并创建它的对象。

在那之后,我有了这个生成的类的几个对象。

所以,我想代理这些对象:

IInterceptor[] interceptors = new IInterceptor[1];
interceptors[0] = new Interceptors.IEditableObjectInterceptor<object>();

return DynamicExtensions.proxyGenerator.CreateClassProxyWithTarget(baseType, target, options, interceptors);

当我执行CreateClassProxyWithTarget 时,它会撞倒我:

Can not instantiate proxy of class: DynamicDigitalInput.
Could not find a parameterless constructor.

所以,信息很清楚。但是,我尝试了下一个:

System.Reflection.ConstructorInfo cInfo = baseType.GetConstructor(new Type[] { });
Assert.That(cInfo != null);

var constructor = baseType.GetConstructor(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic,null, Type.EmptyTypes, null);

Assert.That(constructor != null);

object d = Activator.CreateInstance(baseType, new object[] {});

Assert.That(d != null);

而且效果很好。所以我可以获取默认构造函数并实例化一个DynamicDigitalInput 类对象。

问题出在哪里?

【问题讨论】:

    标签: c# reflection castle-dynamicproxy


    【解决方案1】:

    在第二条语句var constructor = 中,您指定System.Reflection.BindingFlags.NonPublic,这意味着它也应该获得私有构造函数,所以原始类可能有类似下面的代码来解释您的场景。

    public class Dynamic
    {
        private Dynamic()
        {
    
        }
    
        public Dynamic(params object[] exactly)
        {
    
        }
    }
    

    【讨论】:

    • 我已经测试了这个删除System.Reflection.BindingFlags.NonPublic,结果是一样的。我试过getConstructors,它支持我一个包含一个元素的数组。元素是Void .ctor()
    • 如果它可以找到一个无参数的 ctor(),你应该能够在没有额外数据的情况下实例化对象。即使Activator.CreateInstance(baseType, null) 也可以工作。这很奇怪。
    • 真的很奇怪。我已经测试过了,我可以创建这个类的一个实例。
    • 一些想法可以解开这个问题?
    • 老实说我不知道​​,希望这里的其他人能弄清楚。我给了你我的意见,我认为这是我们现在可能得到的最接近的结果。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2021-12-18
    • 2017-04-15
    • 2021-11-27
    • 1970-01-01
    • 2016-03-29
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多