[英]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.
出於絕望,我盡量傳遞myType
和myImplementation
,但我仍然得到同樣的異常。
我要傳遞給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
也應該是類型myType
( myType.GetMethod("SomeMethod")
如果它不將其替換為: myImplementation.GetType().GetMethod("SomeMethod")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.