クラスビルダークラスを作成します。それは適切に動作し、私のクラスは必要なデータに基づいて作成されます。しかし、私はクラスに追加されたプロパティを見ることができませんでした。C#:私のクラス(動的に作成された)クラスが表示されない理由
それは私のクラスのビルダークラスです:
using System;
using System.Reflection;
using System.Reflection.Emit;
namespace aitClassBuilder
{
public interface IclassBuilder
{
float Read(Int32 first, Int32 second);
string Write();
}
public class ClassBuilder : IclassBuilder
{
AssemblyName asemblyName;
public ClassBuilder(string ClassName, string ClassId)
{
this.asemblyName = new AssemblyName(ClassName);
}
public object CreateObject()
{
TypeBuilder DynamicClass = this.CreateClass();
this.CreateConstructor(DynamicClass);
CreateProperty(DynamicClass, "ColumnId", Type.GetType("System.Int32"));
CreateProperty(DynamicClass, "ColumnName", Type.GetType("System.String"));
Type type = DynamicClass.CreateType();
return Activator.CreateInstance(type);
}
private TypeBuilder CreateClass()
{
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(this.asemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
TypeBuilder typeBuilder = moduleBuilder.DefineType(this.asemblyName.FullName, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoLayout, null);
return typeBuilder;
}
private void CreateConstructor(TypeBuilder typeBuilder)
{
typeBuilder.DefineDefaultConstructor(MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName);
}
private void CreateProperty(TypeBuilder typeBuilder, string propertyName, Type propertyType)
{
FieldBuilder fieldBuilder = typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
MethodBuilder getPropMthdBldr = typeBuilder.DefineMethod("get_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
ILGenerator getIl = getPropMthdBldr.GetILGenerator();
getIl.Emit(OpCodes.Ldarg_0);
getIl.Emit(OpCodes.Ldfld, fieldBuilder);
getIl.Emit(OpCodes.Ret);
MethodBuilder setPropMthdBldr = typeBuilder.DefineMethod("set_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new[] { propertyType });
ILGenerator setIl = setPropMthdBldr.GetILGenerator();
Label modifyProperty = setIl.DefineLabel();
Label exitSet = setIl.DefineLabel();
setIl.MarkLabel(modifyProperty);
setIl.Emit(OpCodes.Ldarg_0);
setIl.Emit(OpCodes.Ldarg_1);
setIl.Emit(OpCodes.Stfld, fieldBuilder);
setIl.Emit(OpCodes.Nop);
setIl.MarkLabel(exitSet);
setIl.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getPropMthdBldr);
propertyBuilder.SetSetMethod(setPropMthdBldr);
}
public float Read(Int32 first, Int32 second)
{
return first + second;
}
public string Write()
{
string result = "";
return result;
}
}
}
と私はこのようなクラスから使用してください。私は私のクラスのColumnIDのプロパティへのアクセスを取得したい場合は、このコードの末尾に
aitClassBuilder.ClassBuilder myCls =
new ClassBuilder("Sys_Columns", "1003");
object myTbl = myCls.CreateObject();
MessageBox.Show(myTbl.ColumnID);
エラーが発生しました。しかし、クラスをウォッチウィンドウに追加すると、クラスにプロパティが追加されていることがわかりました。どうしてか分かりません? お願いします。
エラーの詳細は: エラー 'オブジェクト'に 'ColumnID'の定義が含まれておらず、 'オブジェクト'のタイプの最初の引数を受け入れる拡張メソッド 'ColumnID'が見つかりませんでした(usingディレクティブFormSample E:¥New Hafiz¥aitClassBuilder¥FormSample¥Form1.cs 29 Active
例外は.. –
おそらく約10行以下のコードでこの質問をしていた可能性があります –
エラーメッセージを追加しませんでした。これは常に厄介なものです –