簡體   English   中英

如何從基本通用抽象類中獲取只讀字段值

[英]How to get readonly field value from base generic abstract class

我想從基本通用抽象類Base<A, B>檢索只讀字段值_classC

我試過的

FieldInfo.GetValue肯定是必須使用的,但是我猜不出正確的參數。

認為派生類的實例沒問題。

var derived = new Derived();
var baseType = typeof(Base<,>);

var classCField = baseType
  .GetField("_classC", BindingFlags.NonPublic 
    | BindingFlags.Static 
    | BindingFlags.Instance 
    | BindingFlags.FlattenHierarchy);

classCField.GetValue(derived);

我得到的錯誤

InvalidOperationException:無法對 Type.ContainsGenericParameters 為 true 的類型的字段執行后期綁定操作。

這甚至可能嗎?

類型定義

public interface IBase<A, B>
    where A : class
    where B : class, new()
{
    
}

public class ClassD
{
    
}

public class ClassC
{
    
}

public abstract class Base<A, B> : IBase<A, B>
    where A : class
    where B : class, new()
    {
        private readonly ClassC _classC = new ClassC();
    }

public class Derived : Base<ClassC, ClassD>
{
}

做這個 :

var field = typeof(Derived).BaseType.GetField("_classC", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
var value = field.GetValue(derived);

您的第一個錯誤是由使用開放泛型類型引起的,您需要一個構造的類型(例如Base<ClassC, ClassD> )。 下一個錯誤是您的字段不是靜態的。

至於repro:它是DotNetFiddle,它使用關於反射的過時信任模型運行。 IdeOne 上,它運行得很好:

public class Test
{
    public static void Main()
    {
        var derived = new Derived();
        var baseType = derived.GetType().BaseType;
        
        var classCField = baseType.GetField("_classC", BindingFlags.NonPublic | BindingFlags.Instance);
                
        Console.WriteLine(classCField.GetValue((Base)derived));
    }
}

public class ClassC
{
}

public abstract class Base//<A, B> : IBase<A, B> where A : class where B : class, new()
{
    private readonly ClassC _classC = new ClassC();
}

public class Derived : Base//<ClassC, ClassD>
{
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM