我试图找出如何在类CallMe<T>()
的{{1}}内访问静态方法。反思是唯一的解决方案吗?我不想实例化DoSomething
类型的对象。另外,如果通过反射进行,有一种方法可以通过方法MyAction
中的反射一次创建方法,然后多次调用它来对同一个“反射”方法执行多个操作?或者有没有比通过反思更好的方式?我基本上想要创建模板实现样式类,例如CallMe<T>()
,定义MyAction
如何履行其职责。然后,byte[] DoThis(string text)
将指定正在使用的模板,并根据AskForSomething()
进行其工作。
CallMe<T>()
答案 0 :(得分:9)
使用DoThis
定义一个界面,MyAction
实施该界面,并将T
类型参数约束为where T : IMyInterface
答案 1 :(得分:2)
如果您的DoThis
方法需要是静态的,您还可以将CallMe
方法更改为以下内容:
public void CallMe(Func<string, byte[]> action)
{
byte[] result = action("input");
}
现在,您可以将对函数的引用传递给CallMe
方法,如下所示:
doSomething.CallMe(MyAction.DoThis);
答案 2 :(得分:1)
基于“DoThis”不必是静态的事实,您可以通过以下方式实现此目的: -
using System;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
DoSomething doSomething = new DoSomething();
doSomething.CallMe<MyAction>();
}
}
public class DoSomething
{
public void CallMe<T>() where T : IMyAction
{
IMyAction action = (IMyAction)Activator.CreateInstance(typeof(T));
var result = action.DoThis("value");
}
}
public interface IMyAction
{
byte[] DoThis(string text);
}
public class MyAction : IMyAction
{
public byte[] DoThis(string text)
{
byte[] ret = new byte[0]; //mock just to denote something is done and out comes a byte array
return ret;
}
}
}
不确定我会推荐这种方法,但它有效! (例如,如果没有默认构造函数,则会失败)。
答案 3 :(得分:0)
public class DoSomething
{
class Cache<T>
{
public readonly static Func<string, byte[]> action = (Func<string, byte[]>)Delegate.CreateDelegate(typeof(Func<string, byte[]>), typeof(T).GetMethod("DoThis"));
}
public void CallMe<T>()
{
Cache<T>.action("text");
}
}