簡體   English   中英

使用反射調用靜態類中靜態屬性的非靜態成員

[英]Call non-static member of static property in static class with reflection

我有一個靜態類,用於尋找抽象類型的實現,並將其存儲為類似於以下內容的靜態屬性:

public static class MyStaticClass
{
    private static MyAbstractType _MyAbstractImplementation;

    public static MyAbstractType MyAbstractImplementation
    {
        get => _MyAbstractImplementation ?? ( _MyAbstractImplementation = FindImplementation());
        private set => _MyAbstractImplementation = value;
    }
}

我試圖通過反射調用MyAbstractImplementation的方法(其中不包含靜態屬性或方法):

var myAssembly = Assembly.Load("MyStaticClassAssembly")

var myType = myAssembly.GetTypes().First(t => t.Name == "MyAbstractType");

var myImplementation = myType.GetProperties()
    .First(p=>p.ReflectedType?.Name == "MyAbstractImplementation")
    .GetValue(null);

var obj = myType.GetMethod("SomeMethod")?.Invoke(
                null,
                new object[] 
                {
                    // Some args
                });

上面的代碼在獲取MyAbstractImplementation的值時導致以下異常:

System.Reflection.TargetException: Non-static method requires a target.

顯然,這是因為我將null傳遞給GetValue() ,所以我嘗試傳遞myAssembly而不是null,並且得到以下異常:

System.Reflection.TargetException: Object does not match target type.

出於絕望,我盡量傳遞myTypemyImplementation ,但我仍然得到同樣的異常。

我要傳遞給GetValue()意思是什么?

從錯誤中您將獲得MyAbstractImplementation不是靜態屬性,因此需要在其上運行實例。 您基本上是在嘗試編寫以下代碼:

new MyAbstractType().MyAbstractImplementation.SomeMethod();

屬性和方法訪問都需要目標運行(“。”的左側)。 因此,您需要一個myType實例。 該方法還需要實例,這是獲得屬性( myImplementation )的結果。

var myAssembly = Assembly.Load("MyStaticClassAssembly");

var myType = myAssembly.GetTypes().First(t => t.Name == "MyAbstractType");
var myTypeInstance = Activator.CreateInstance(myType);  // Asuming has a default constructor 

var myImplementation = myType.GetProperties()
    .First(p => p.ReflectedType?.Name == "MyAbstractImplementation")
    .GetValue(myTypeInstance);

var obj = myType.GetMethod("SomeMethod")?.Invoke(
                myImplementation,
                new object[]
                {
                    // Some args
                });

從你如何編寫代碼myImplementation也應該是類型myTypemyType.GetMethod("SomeMethod")如果它不將其替換為: myImplementation.GetType().GetMethod("SomeMethod")

暫無
暫無

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

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