使用反射调用静态 class 中静态 属性 的非静态成员
Call non-static member of static property in static class with reflection
我有一个静态 class,它寻找抽象类型的实现并将其存储为静态 属性
类似于以下内容:
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")
.
我有一个静态 class,它寻找抽象类型的实现并将其存储为静态 属性 类似于以下内容:
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")
.