gpt4 book ai didi

c# - 使用反射创建类型时出现问题

转载 作者:行者123 更新时间:2023-11-30 20:11:44 25 4
gpt4 key购买 nike

我有以下基类:

public class ValidationItem 
{
public ObservableCollection<object> GetFilteredValues( ObservableCollection<object> values)
{
return new ObservableCollection<object>(); // nothing here yet
}

我创建了一个继承此基类型的类型,并创建了一个将返回基类 GetFilteredValues 方法结果的 getter。

新属性应该是这样的:

public ObservableCollection<object> Values
{
get { return GetFilteredValues(_values); }
set { _values = value; }
}

这是我的做法:

Type pType = typeof(ObservableCollection<object>);

FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName, pType, FieldAttributes.Private);

PropertyBuilder propertyBuilder = tb.DefineProperty( propertyName, PropertyAttributes.HasDefault, pType, null);

MethodBuilder getPropMthdBldr = tb.DefineMethod("get_" + propertyName,
MethodAttributes.Public |
MethodAttributes.SpecialName |
MethodAttributes.HideBySig,
pType, Type.EmptyTypes);
getPropMthdBldr.SetReturnType(typeof(ObservableCollection<>).MakeGenericType(typeof(object)));
ILGenerator getIL = getPropMthdBldr.GetILGenerator();

MethodInfo minfo = typeof(ValidationItem).GetMethod("GetFilteredValues", new[] { typeof(ObservableCollection<object>) }); // it's not null so everything is ok here

getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, fieldBuilder);
getIL.EmitCall(OpCodes.Callvirt, minfo, Type.EmptyTypes);
getIL.Emit(OpCodes.Ret);

propertyBuilder.SetGetMethod(getPropMthdBldr);

但每次我运行一个应用程序并使用这个创建的类型时,我都会收到一个错误“公共(public)语言运行时检测到一个无效程序”。我做错了什么?

提前致谢。

最佳答案

当您调用 GetFilteredValues 时,堆栈上唯一的东西是 ObservableCollection<object> .自 GetFilteredValues是实例方法,还需要push this .加一个Ldarg_0在现有的之前,以便您在 _values 之前将其插入堆栈:

getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, fieldBuilder);
getIL.EmitCall(OpCodes.Callvirt, minfo, Type.EmptyTypes);
getIL.Emit(OpCodes.Ret);

关于c# - 使用反射创建类型时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3334799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com