あなたがに割り当てるフィールドの名前を知っているとき、配列は未知のタイプの配列に割り当てることができますか?
-
12-09-2019 - |
質問
私は、フィールドに配列を割り当てる必要があります。私は、フィールドの種類を知らないが、私はインスタンスへの参照とフィールドの名前を持っています。私は配列はフィールド型にキャストすることが可能と仮定することができます。これを行うことができますか?
バ
編集ます:
うまくいけば、このコードはイムがやろうと何を明らかにし、これは割り当てで例外が発生します:
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
種類魂が私に解決策を示したので、楽しむ:)
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 { }
他のヒント
instance.GetType()
.GetField("fieldName", BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(instance, array);
詳細については、MSDNのの上反射ページを参照してください。
これを呼び出すコードがtimecriticalされていない場合、あなたは単にFieldInfosのSetValue()
を使用することができますobj.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic).SetValue(obj, newFieldValue);
コードはより頻繁に呼び出される場合は、動的セッター-デリゲートをコンパイルしたいかもしれません。これは、例えば行うことができます軽量なコード生成を使用します:
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>;
}
所属していません StackOverflow