System.Reflection.TargetException: Non-static method requires a target.的意思是什么?

10

在我的应用程序中,我从某个地方接收functionCode值并需要反映相应的类。根据这个解决方案,我尝试了反射适当的类型,但对我不起作用。我无法使用GetField()方法,因为我正在一个PCL项目上工作。因此,我尝试了以下代码:

AssemblyName name = new AssemblyName("MyLibrary");
var type = Assembly.Load(name);
type.DefinedTypes.FirstOrDefault(x =>
x.GetDeclaredProperty("functionCode") != null &&
 (byte)x.GetDeclaredProperty("functionCode").GetValue(null) == val);

它也不起作用。它抛出了System.Reflection.TargetException异常:非静态方法需要一个目标。


2个回答

14

这意味着非静态方法需要一个对象。如果您有一个实例成员,则必须使用实例才能获取其值。因为没有实例它不存在。所以,您需要传递该类型的一个实例而不是nullGetValue方法。或者,如果您不希望它成为实例成员,请将该成员static化。


谢谢。我写了这个代码并且它可以工作:DefinedTypes.FirstOrDefault(x => x.GetDeclaredProperty("functionCode") != null && !x.IsAbstract && x.BaseType == typeof(MyClass) && (byte)x.GetDeclaredProperty("functionCode").GetValue(Activator.CreateInstance(x.AsType()), null) == val);这���可以吗?如果你能指导我更好的解决方案,我会很感激的。谢谢 - a.toraby
1
@a.toraby 如果属性的值对于不同的实例没有变化,那么这是可以的。顺便说一下,如果是这种情况,我会将其设置为静态而不是实例成员。 - Selman Genç
谢谢。我不能将它设为静态的,它应该是可继承的。 - a.toraby

0

这个错误的另一个原因是,当您从一个实例对象中读取值时,您读取的实例对象是null


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接