在发现它支持它之后调用类上的静态方法

时间:2016-03-17 20:46:41

标签: c#

这个问题将是“定义静态接口”,但我意识到这是

  • 已经问过(来自Skeet的回答=否)

  • 预先假定答案

所以问题是。我有一个接受类型的方法(目前它不是通用方法,但如果需要可以更改)。我需要知道这种类型是否有给定的方法,如果是这样,请调用该方法。

我知道我可以定义一个接口,并使该类实现该接口,并在其类型正确的情况下实例化并调用该方法。喜欢这个

public interface IDoFizz
{
    void Fizz();
}

...

var t = Activator.CreateInstance(type);
if(t is IDoFizz)
{
    (t as IDoFizz).Fizz();
}

问题在于我必须实例化对象。这可能很昂贵,甚至不可能(如果它没有空的构造函数或它的静态类)

那么任何想法?我在考虑像

这样的东西
DoThing<T>(xxx) where T: IDoFizz
{
 // code that calls IFoo.Fizz
}
DoThing<T>()
{
}

但感觉有点笨重。或者我想我可以使用反射来查看它是否支持该方法。

“你能再描述一下推理吗”

这是一个作业调度系统。类型是要提交的作业的类型。这些工作都实现了IAmAJob。一旦作业运行,它就会被实例化并调用IAmAJob.run。显然,我可以将Fizz(实际上是一个预检检查)添加到IAmAJob界面。但这意味着我必须实例化它 - 我不想这样做。预检检查是一种非常快乐的静态方法

1 个答案:

答案 0 :(得分:0)

如果您需要呼叫非静态成员(如您的示例中,但与您的问题标题不同),您可以执行以下操作:

DoThing<T>() where T: IDoFizz, new()
{
   new T().Fizz();
}

但是对于静态方法,你必须使用像:

这样的反射
public void DoThing(Type t)
{
    var m = t.GetMethod("Fizz", BindingFlags.Public | BindingFlags.Static);
    if(m != null)
        m.Invoke(null, null);
}