0

ループしているデータテーブルの列名と一致するプロパティ値を (リフレクションを使用して) 変更しようとしています。

プロパティを変更するための私のコードは次のとおりです。

Type type = myTypeBuilder.CreateType();
foreach (DataRow row in table.Rows)
{
 object testobject = Activator.CreateInstance(retval, true);
 foreach (DataColumn col in table.Columns)
 {
   PropertyInfo property = testobject .GetType().GetProperty(col.ColumnName);
   property.SetValue(testobject , row[col], BindingFlags.CreateInstance, null, null, null);
 }
}

その結果、テーブルの DataColumns をループしている間に正しいプロパティを取得しますが、SetValue の後、「testobject」のすべてのプロパティ値は、選択したプロパティのみが持つべき値で設定されます。

これは私がタイプを生成する方法です:

foreach (DataColumn col in table.Columns)
        {
            string propertyname=col.ColumnName;
            // The last argument of DefineProperty is null, because the 
            // property has no parameters. (If you don't specify null, you must 
            // specify an array of Type objects. For a parameterless property, 
            // use an array with no elements: new Type[] {})

            PropertyBuilder custNamePropBldr = myTypeBuilder.DefineProperty(propertyname, System.Reflection.PropertyAttributes.None, typeof(string), null);
            // The property set and property get methods require a special 
            // set of attributes.
            MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;

            // Define the "get" accessor method for CustomerName.
            MethodBuilder custNameGetPropMthdBldr = myTypeBuilder.DefineMethod("get_"+propertyname, getSetAttr, typeof(string), Type.EmptyTypes);

            ILGenerator custNameGetIL = custNameGetPropMthdBldr.GetILGenerator();
            custNameGetIL.Emit(OpCodes.Ldarg_0);
            custNameGetIL.Emit(OpCodes.Ldfld, customerNameBldr);
            custNameGetIL.Emit(OpCodes.Ret);

            // Define the "set" accessor method for CustomerName.
            MethodBuilder custNameSetPropMthdBldr = myTypeBuilder.DefineMethod("set_"+propertyname, getSetAttr, null, new Type[] { typeof(string) });

            ILGenerator custNameSetIL = custNameSetPropMthdBldr.GetILGenerator();
            custNameSetIL.Emit(OpCodes.Ldarg_0);
            custNameSetIL.Emit(OpCodes.Ldarg_1);
            custNameSetIL.Emit(OpCodes.Stfld, customerNameBldr);
            custNameSetIL.Emit(OpCodes.Ret);

            // Last, we must map the two methods created above to our PropertyBuilder to  
            // their corresponding behaviors, "get" and "set" respectively. 
            custNamePropBldr.SetGetMethod(custNameGetPropMthdBldr);
            custNamePropBldr.SetSetMethod(custNameSetPropMthdBldr);
        }

何が原因か分かりますか?

ありがとう

ホセ。

4

1 に答える 1

1

foreach ループで customerNameBldr が変更されることはないようです (タイプを生成するとき)。

このように、すべてのプロパティ セッターとゲッターが同じフィールドを参照するため、すべてのセッターが同じフィールドの値を変更し、すべてのプロパティ ゲッターが同じフィールドの値を取得します。

custNameGetIL.Emit(OpCodes.Ldfld, customerNameBldr); 
于 2012-10-10T10:40:54.877 に答える