C# 在发现类支持静态方法后对其调用静态方法

C# 在发现类支持静态方法后对其调用静态方法,c#,C#,这个问题将是“定义静态接口”,但我意识到这是真的 已提问(双向飞碟回答=否) 预先假定了答案 所以问题是。我有一个接受类型的方法(目前不是泛型方法,但如果需要可以更改)。我需要知道这个类型是否有给定的方法,如果有,请调用该方法 我知道我可以定义一个接口,让类实现该接口,并实例化它的类型是否正确,然后调用该方法 public interface IDoFizz { void Fizz(); } 问题是这意味着我必须实例化这个对象。这可能很昂贵,甚至是不可能的(如果它没有空构造函数或

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

  • 已提问(双向飞碟回答=否)

  • 预先假定了答案

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

我知道我可以定义一个接口,让类实现该接口,并实例化它的类型是否正确,然后调用该方法

public interface IDoFizz
{
    void Fizz();
}

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

有什么想法吗?我在想

DoThing<T>(xxx) where T: IDoFizz
{
 // code that calls IFoo.Fizz
}
DoThing<T>()
{
}
DoThing(xxx)其中T:idoozz
{
//调用IFoo.Fizz的代码
}
DoThing()
{
}
但是它感觉有点笨重。或者我想我可以用反射来看看它是否支持这个方法


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


这是一个作业调度系统。类型是正在提交的作业的类型。所有作业都实现IAmAJob。一旦作业运行,就会实例化并调用IAmAJob.run。因此,显然我可以添加Fizz(实际上是飞行前检查)到IAmAJob接口。但这意味着我必须实例化它-我不想这样做。飞行前检查是一个非常好的静态方法

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

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

你需要反射。你需要调用你在标题中说的静态方法。为什么你需要一个对象?非常接近/很好的起点是关于如何使用反射来调用静态方法的问题:从表面上看问题,答案是使用反射,我认为你没有选择。但取决于位置此外,您可能还有其他选择,例如传递lambda。您是否可以添加更多的上下文来描述如何调用此代码,我们可能会找到一种更简洁的方法来实现您想要的。您是否可以进一步描述推理?静态方法做什么?它是否定义在没有公共基类型的多个类型上?您为什么不知道如果该类型将有或没有静态方法?除了称为此静态方法之外,您对该类型做了什么?(请添加到您的问题中,而不是作为注释)是的,我计算出我需要能够执行T.Fizz()。反射方法对我来说似乎很臭
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);
}