maf*_*afu 6 .net c# reflection explicit-implementation
通常,我在这样的反射中访问一个方法:
class Foo
{
public void M () {
var m = this.GetType ().GetMethod ("M");
m.Invoke(this, new object[] {}); // notice the pun
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当M是显式实现时,这会失败:
class Foo : SomeBase
{
void SomeBase.M () {
var m = this.GetType ().GetMethod ("M");
m.Invoke(this, new object[] {}); // fails as m is null
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用反射访问显式实现的方法?
Fre*_*örk 10
这是因为方法的名称不是"M"
,它将是"YourNamespace.SomeBase.M"
.因此,无论你需要指定名称(用适当情况下BindingFlags
),或者从接口类型,而不是方法.
因此给出以下结构:
namespace SampleApp
{
interface IFoo
{
void M();
}
class Foo : IFoo
{
void IFoo.M()
{
Console.WriteLine("M");
}
}
}
Run Code Online (Sandbox Code Playgroud)
......你可以这样做:
Foo obj = new Foo();
obj.GetType()
.GetMethod("SampleApp.IFoo.M", BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(obj, null);
Run Code Online (Sandbox Code Playgroud)
...或这个:
Foo obj = new Foo();
typeof(IFoo)
.GetMethod("M")
.Invoke(obj, null);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2371 次 |
最近记录: |