2

Reflector をチェックインするとFieldInfo.SetValueDirect、次のようになります。

C#、.NET 4.0:

[CLSCompliant(false)]
public virtual void SetValueDirect(TypedReference obj, object value)
{
    throw new NotSupportedException(Environment.GetResourceString("NotSupported_AbstractNonCLS"));
}

そしてILとして:

.method public hidebysig newslot virtual instance void SetValueDirect(valuetype System.TypedReference obj, object 'value') cil managed
{
    .custom instance void System.CLSCompliantAttribute::.ctor(bool) = { bool(false) }
    .maxstack 8
    L_0000: ldstr "NotSupported_AbstractNonCLS"
    L_0005: call string System.Environment::GetResourceString(string)
    L_000a: newobj instance void System.NotSupportedException::.ctor(string)
    L_000f: throw 
}

ただし、次のコードを実行すると、うまくいきます

// test struct:
public struct TestFields
{
    public int MaxValue;
    public Guid SomeGuid;   // req for MakeTypeRef, which doesn't like primitives
}


[Test]
public void SettingFieldThroughSetValueDirect()
{

    TestFields testValue = new TestFields { MaxValue = 1234 };

    FieldInfo info = testValue.GetType().GetField("MaxValue");
    Assert.IsNotNull(info);

    // TestFields.SomeGuid exists as a field
    TypedReference reference = TypedReference.MakeTypedReference(
        testValue, 
        new [] { fields.GetType().GetField("SomeGuid") });

    int value = (int)info.GetValueDirect(reference, );
    info.SetValueDirect(reference, 4096);

    // assert that this actually worked
    Assert.AreEqual(4096, fields.MaxValue);

}

エラーはスローされません。についても同様ですGetValueDirect。リソースの名前に基づく私の推測では、これはコードがCLSCompliantでなければならない場合にのみスローされますが、メソッドの本体はどこにありますか? または、別の言い方をすれば、メソッドの実際の本体をどのように反映できますか?

4

2 に答える 2

5

仮想メソッドです。おそらく、実際の実装で派生Type.GetField()型を返しています-印刷を試してください。(私はちょうど自分の箱を試してみましたが、それは例えば示しました。)info.GetType()System.RtFieldInfo

于 2012-03-29T14:15:18.630 に答える
3

デバッガーはtestValue.GetType().GetField("MaxValue")、FieldInfoから派生したRuntimeFieldInfoから派生したRtFieldInfoを返します。したがって、このメソッドはこれらのクラスの1つでオーバーライドされた可能性があります。おそらく、ランタイムタイプとリフレクションのみのロードされたアセンブリからのタイプのFieldInfoの実装が異なるためです。

于 2012-03-29T14:24:42.497 に答える