2016-03-24 17 views
2

alana yük, ancak birC# Dinamik derleme yeni bir nesne oluşturmak ve bana verilen türü için yeni bir nesne oluşturmak ve alana yüklemek çalışıyorum

InvalidProgramException atar olamaz.

Yerliler ile aynı işlemleri yapmak. Belki tarlalarda yanlış bir şeyler mi yapıyorsun?

MethodAttributes getSetAttr = MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig; 
FieldBuilder propNameBldr = typeBuilder.DefineField("_" + PropName, PropType, FieldAttributes.Private); 
propNamePropBldr = typeBuilder.DefineProperty(PropName, PropertyAttributes.HasDefault, PropType, null); 
propNameGetPropMthdBldr = typeBuilder.DefineMethod("get_" + PropName, getSetAttr, PropType, Type.EmptyTypes); 
ConstructorInfo baseCtor = basePropType.GetConstructor(new Type[] { }); 

ILGenerator propNameGetIL = propNameGetPropMthdBldr.GetILGenerator(); 

propNameGetIL.Emit(OpCodes.Newobj, baseCtor); 
propNameGetIL.Emit(OpCodes.Stfld, PropNameBldr); 

propNameGetIL.Emit(OpCodes.Ldfld, PropNameBldr); 
propNameGetIL.Emit(OpCodes.Ret); 
propNamePropBldr.SetGetMethod(propNameGetPropMthdBldr); 

Ama bu işler: Bu işe yaramazsa

MethodAttributes getSetAttr = MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig; 
FieldBuilder propNameBldr = typeBuilder.DefineField("_" + PropName, PropType, FieldAttributes.Private); 
propNamePropBldr = typeBuilder.DefineProperty(PropName, PropertyAttributes.HasDefault, PropType, null); 
propNameGetPropMthdBldr = typeBuilder.DefineMethod("get_" + PropName, getSetAttr, PropType, Type.EmptyTypes); 
ConstructorInfo baseCtor = basePropType.GetConstructor(new Type[] { }); 

ILGenerator propNameGetIL = propNameGetPropMthdBldr.GetILGenerator(); 
LocalBuilder lc = propNameGetIL.DeclareLocal(PropType); 
propNameGetIL.Emit(OpCodes.Newobj, baseCtor); 
propNameGetIL.Emit(OpCodes.Stloc, PropNameBldr); 

propNameGetIL.Emit(OpCodes.Ldloc, PropNameBldr); 
propNameGetIL.Emit(OpCodes.Ret); 
propNamePropBldr.SetGetMethod(propNameGetPropMthdBldr); 

Yani fark nedir ve neden ilk çalışmıyor? Teşekkürler.

cevap

1

Statik olmayan alanların bir nesne başvurusu gerekir. İLA üretmenin daha iyi bir yolu, ifade ağaçlarını kullanmaktır. Ayrıca, bu tür soruları C# kodunda eşdeğer bir kod yazıp derleyici çıktısını daşifre ederek kendiniz yanıtlayabilirsiniz.

+0

Cevabınız için teşekkürler. Oluşturulan IL'yi ve bir soruyu da araştırdım, bu yüzden bu tür bir yaklaşım kullanarak nesneyi yaratamam ve yaratılan statik olmayan alana yerleştiremem anlamına geliyor? – Druid

+1

Elbette, ancak belirli bir nesnenin alanına depolamanız gerekiyor. Sorunuzu anladığımdan emin değilim ... Alanın içinde yaşadığı bir nesneyi sağlamadan statik olmayan bir alana depolamanız mantıklı mı ?! – usr

+0

Peki, veri proxy üreteci oluşturmaya çalışıyorum, bu yüzden bazı arabirimleri uygulayan belirli bir tür için, sarmalayıcı sınıfı gibi bir şey yaratmaya çalışıyorum, bu yüzden uygun alıcıları kullanarak. Ancak sorun o zaman arayüzde ve giriş nesnesi tipinde aynı olmayan sınıf türleri oluyor. Nesne özelliğinde, arayüzde "A" nın tipi, "B" tipi. Bu nedenle, uygun nesne türünü oluşturmaya ve yuvalanmış alanları ayarlamaya çalışmanın nedeni budur. – Druid

İlgili konular