2

フィールドに配列を割り当てる必要があります。フィールドのタイプはわかりませんが、インスタンスとフィールドの名前への参照があります。配列をフィールド型にキャストできると想定できます。これはできますか?

バス

編集:

このコードが私が何をしようとしているのかを明確にすることを願っています。これにより、代入で例外が発生します。

class MyClass
{
    static void Main()
    {
        MyClass t = new MyClass();
        A a = new A();
        C[] c = new C[] {new B()};
        t.Assign(a, "field", c);
    }

    void Assign(object obj, string field, object[] value)
    {
        // crashes
        obj.GetType().GetField(field).SetValue(obj, value);
    }
}

class A
{
    public B[] field;
}

class B : C { }

class C { }
4

4 に答える 4

5
instance.GetType()
    .GetField("fieldName", BindingFlags.Instance | BindingFlags.NonPublic)
    .SetValue(instance, array);
于 2009-11-02T20:30:11.727 に答える
1

詳細については、MSDN のリフレクション ページを参照してください。

于 2009-11-02T20:34:41.507 に答える
0

これを呼び出すコードがタイムクリティカルでない場合は、FieldInfos SetValue()を使用するだけです。

obj.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic).SetValue(obj, newFieldValue);

コードがより頻繁に呼び出される場合は、setter-delegateを動的にコンパイルすることをお勧めします。これは、たとえば軽量コード生成を使用して実行できます。

Action<TObject, TField> ConstructGetter(string fieldName)
{
    System.Reflection.FieldInfo field = typeof(TObject).GetField(fieldName);
    DynamicMethod method = new DynamicMethod(typeof(TObject).ToString() + ":" + "Set:" + name,
                                             null, new Type[] { typeof(TObject), typeof(TField) }, typeof(TObject));
    ILGenerator generator = method.GetILGenerator();
    generator.Emit(OpCodes.Ldarg_0);
    generator.Emit(OpCodes.Ldarg_1);
    generator.Emit(OpCodes.Stfld, field);
    generator.Emit(OpCodes.Ret);
    return method.CreateDelegate(typeof(Action<TObject, TField>)) as Action<TObject, TField>;
}
于 2009-11-02T23:52:37.580 に答える
0

だから親切な魂が解決策を教えてくれました、楽しんでください:)

using System;
using System.Reflection;

class MyClass
{
    static void Main()
    {
        MyClass t = new MyClass();
        A a = new A();
        C[] c = new C[] {new B()};
        t.Assign(a, "field", c);
    }

    void Assign(object obj, string field, object[] value)
    {
        FieldInfo pinfo = obj.GetType().GetField(field);
        Array array = Array.CreateInstance(pinfo.FieldType.GetElementType(), value.Length);
        value.CopyTo(array, 0);
        pinfo.SetValue(obj, array);
    }
}

class A
{
    public B[] field;
}

class B : C { }

class C { }
于 2009-11-03T02:01:02.530 に答える