我有一个声明虚拟方法的类。但是,此方法的特定实现未明确引用“ this”对象。他们只是返回一个特定于该类的值。
因此,人们可能一直希望不仅在特定对象上而且在类本身上都调用此方法。由于在语法层面上这当然是不可能的,所以我认为至少应该通过反思来实现。也就是说,我要遍历程序集中的所有类,并确定哪个类返回哪个值作为所述方法的响应。
但是,我的幼稚方法在尝试调用该方法时失败,并出现了空引用异常。为什么?我希望它能够成功,因为我已经使用了一个具体的类来标识具体的重写方法,因此不需要“ this”对象及其虚拟方法表来解析该方法。
我该如何运作?(当然,不包括定义第二个返回相同值的真正静态方法的“解决方案”)。
using System;
using System.Reflection;
namespace StaticInvoke
{
public abstract class Foo
{
public abstract string StaticValue {get;}
}
public class MyFirstFoo: Foo
{
public override string StaticValue {get {return "A first attempt to foo-ize Foo.";}}
}
class Program
{
public static void Main(string[] args)
{
Type myFirstFooType = typeof(MyFirstFoo);
PropertyInfo myFirstStaticValueProperty = myFirstFooType.GetProperty("StaticValue");
MethodInfo myFirstStaticValueMethod = myFirstStaticValueProperty.GetGetMethod();
string result = (string)myFirstStaticValueMethod.Invoke(null, null);
Console.WriteLine("MyFirstFoo.StaticValue == "+result);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,此方法的特定实现未明确引用“ this”对象。
是的,c#语言不需要前缀,this因为它没有必要。
因此,人们可能一直希望不仅在特定对象上而且在类本身上都调用此方法。
那是不可能的。C#不允许实例方法和静态方法使用相同的名称。因此,这种愿望无法解决,因此必须采取其他解决方案。
由于在语法层面上这当然是不可能的,所以我认为至少应该通过反思来实现。
反射仅在允许的范围内进行。如果您不能同时使用相同名称的静态实例和实例,则Reflection 不会解决它。
但是,我的幼稚方法在尝试调用该方法时失败,并出现了空引用异常。为什么?
因为您在NULL上调用了Instance Method。您的示例可以简化为:
(null as string).Count()
Run Code Online (Sandbox Code Playgroud)
同样的事情,没有反思。您不能在NULL上调用Count()。
我希望它能够成功,因为我已经使用了一个具体的类来标识具体的重写方法,因此不需要“ this”对象及其虚拟方法表来解析该方法。
你仍然不能不管你怎么称呼一个空对象的方法施放它。
我该如何运作?(当然,不包括定义第二个返回相同值的真正静态方法的“解决方案”)。
您不能基于以下要求:
不仅要在特定对象上调用此方法,还要在类本身上调用此方法。
更新1:
相反,无论解决方案是什么,我的要求都是在静态上下文中获取实例方法主体(值)中包含的明显静态信息。
这确实很令人困惑,因此下面是示例代码:
public class Person
{
// So this is "Static Inforamtion"
public static int StaticInformation()
{
return 1;
}
// instance method
public static int InstanceMethod()
{
return StaticInformation();
}
}
public static class StaticClass
{
public static int StaticContext()
{
return Person.InstanceMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
这是根据您的陈述而假定的。这是我最好的描述您的句子为代码的方法。对大多数(如果不是全部).Net开发人员来说,说静态信息应该意味着标记为静态的方法,属性或字段。但是,声明包含在实例主体中的静态信息非常不明确。什么是身体?实例方法的主体还是类的主体?
我也想知道为什么有人要这样做。看来这只是一个理论问题,无法解决任何现实情况。在C#的哪种情况下,我将拥有一个排序的方法指针(MethodInfo),并且想在不知道自己是否有实例的情况下调用它?如果期望得到相同的结果,那么为什么根本需要Instance方法呢?
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |