C# Castle DynamicProxy DefaultProxyBuilder.CreateClassProxyType不适用于代理生成器

C# Castle DynamicProxy DefaultProxyBuilder.CreateClassProxyType不适用于代理生成器,c#,castle-dynamicproxy,C#,Castle Dynamicproxy,我正在尝试使用mixin创建代理类型。在下面的示例中,TypePresenter实现ICustomTypeDescriptor。当我创建一个实例时,“GetProperties”抛出一个NotImplementedException 当我用ProxyGenerator.CreateClassProxy做同样的事情时,一切都很好!我想得到这个类型,这样我就可以在我的IoC中使用它了 var options = new ProxyGenerationOptions(); options.AddMix

我正在尝试使用mixin创建代理类型。在下面的示例中,TypePresenter实现ICustomTypeDescriptor。当我创建一个实例时,“GetProperties”抛出一个NotImplementedException

当我用ProxyGenerator.CreateClassProxy做同样的事情时,一切都很好!我想得到这个类型,这样我就可以在我的IoC中使用它了

var options = new ProxyGenerationOptions();
options.AddMixinInstance(new TypePresenter<SampleViewModel>());

var builder = new DefaultProxyBuilder();
var sampleType = builder.CreateClassProxyType(typeof(SampleViewModel), null, options);
var sample = Activator.CreateInstance(sampleType);

var typeDescriptor = (ICustomTypeDescriptor)sample;

// Error happens on this line.
var properties = typeDescriptor.GetProperties();

var property = properties["DoIt"];
Assert.IsNotNull(property);
Assert.IsTrue(property.PropertyType == typeof(ICommand));
var options=newproxygenerationoptions();
options.addMixiInstance(新的TypePresenter());
var builder=新的DefaultProxyBuilder();
var sampleType=builder.CreateClassProxyType(typeof(SampleViewModel),null,options);
var sample=Activator.CreateInstance(sampleType);
var typeDescriptor=(ICustomTypeDescriptor)样本;
//错误发生在这条线上。
var properties=typeDescriptor.GetProperties();
var property=properties[“DoIt”];
Assert.IsNotNull(属性);
Assert.IsTrue(property.PropertyType==typeof(ICommand));

为什么这不起作用

您正在从
Activator
创建示例对象;由于未使用Castle DynamicProxy库创建代理,因此mixin属性无法工作,因为mixin后面的连接是通过intereceptor完成的

您只需首先通过ProxyGenerator创建示例,然后将其强制转换为
ICustomTypeDescriptor
,您实际上不需要它的类型:

var options = new ProxyGenerationOptions();
options.AddMixinInstance(new TypePresenter<SampleViewModel>());

var pg = new ProxyGenerator();
var sample = pg.CreateClassProxy<SampleViewModel>(options); 
// regarding
//var sampleType = sample.GetType();

var typeDescriptor = (ICustomTypeDescriptor)sample;

// Error doesn't happen anymore on this line.
var properties = typeDescriptor.GetProperties();
var options=newproxygenerationoptions();
options.addMixiInstance(新的TypePresenter());
var pg=新的ProxyGenerator();
var sample=pg.CreateClassProxy(选项);
//关于
//var sampleType=sample.GetType();
var typeDescriptor=(ICustomTypeDescriptor)样本;
//这条线上不再发生错误。
var properties=typeDescriptor.GetProperties();
编辑 在不预先知道构造函数的情况下重新构建类型,可以使用CreateClassProxy重载,该重载将构造函数参数的object[]作为参数

给定和接口,允许我们定义类型所需的参数:

public interface IGiveConstructorParametersFor<T> {
    object[] Parameters {get;}
}
公共接口IGIVeConstructorParameters的{ 对象[]参数{get;} } 可以针对一个具体类(甚至多个具体类)注册它,然后根据我们所处的场景来解析这些具体类。然后,我们可以使用以下方法,使用我们事先不知道的构造函数参数构建一个我们事先不知道的类型:

public T Proxify<T>(IGiveConstructorParametersFor<T> constructorParametersForT) {
    var options = new ProxyGenerationOptions();
    options.AddMixinInstance(new TypePresenter<T>());

    var pg = new ProxyGenerator();
    var sample = pg.CreateClassProxy(typeof(T),
                                     null,
                                     options,
                                     constructorParametersForT.Parameters);

    var typeDescriptor = (ICustomTypeDescriptor)sample;
    var properties = typeDescriptor.GetProperties();
}
public T proxy(用于构造函数的IGIVeConstructorParameters forConstructorParameters fort){
var options=new ProxyGenerationOptions();
options.addMixiInstance(新的TypePresenter());
var pg=新的ProxyGenerator();
var sample=pg.CreateClassProxy(类型(T),
无效的
选项,
constructorParametersForT.Parameters);
var typeDescriptor=(ICustomTypeDescriptor)样本;
var properties=typeDescriptor.GetProperties();
}

只要任何类型可以在运行时映射到构造函数参数接口的实现,就不需要事先知道它

谢谢@samy的回复。如果你读了我的问题,我已经说过ProxyGenerator可以工作,但是当我尝试使用IoC时,它几乎没有什么用处。我已经解决了这个问题。本周末我将试着回过头来发布答案。@Phillips Cottgivens我解释了为什么
Activator
-创建的对象没有在答案的第一部分实现ICustomTypeDescription,但是我不明白为什么ProxyGenerator选项在IoC中会出现问题。请使用IoC容器提供一些解决方案的示例代码,您不知道将传递给构造函数的内容。@Phillips Cottgivens我编辑了我的答案;
对象
数组的使用是否符合您关于基于IoC构建代理对象的想法?我觉得我们在兜圈子。我在你的例子中没有看到IoC代码。我正在使用Autofac,也许您可以演示Autofac将如何使用您的方法解析构造函数参数@萨米