这个问题将是“定义静态接口”,但我意识到这是
已经问过(来自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界面。但这意味着我必须实例化它 - 我不想这样做。预检检查是一种非常快乐的静态方法
答案 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);
}