我试图弄清楚如何在DoSomething
类的CallMe<T>()
中访问静态方法。反射是这里唯一的解吗?我不想实例化类型为MyAction
的对象。此外,如果通过反射这样做,是否有一种方法可以通过方法CallMe<T>()
中的反射创建方法,然后多次调用它对相同的"反射"方法执行多个操作?或者有比反思更好的方法吗?我基本上想创建模板实现风格类,如MyAction
,定义byte[] DoThis(string text)
如何执行其职责。然后,AskForSomething()
将指定正在使用的模板,并根据CallMe<T>()
将继续其工作。
public class AskSomething
{
public void AskForSomething()
{
DoSomething doSomething = new DoSomething();
doSomething.CallMe<MyAction>();
}
}
public class DoSomething
{
public void CallMe<T>()
{
Type type = typeof(T);
//Question: How can I access 'DoThis(string text)' here?
//Most likely by reflection?
}
}
public class MyAction
{
public static byte[] DoThis(string text)
{
byte[] ret = new byte[0]; //mock just to denote something is done and out comes a byte array
return ret;
}
}
用DoThis
定义一个接口,让MyAction
实现它,并将T
类型参数约束为where T : IMyInterface
的一个实例
如果您的DoThis
方法需要是静态的,您也可以将您的CallMe
方法更改为以下内容:
public void CallMe(Func<string, byte[]> action)
{
byte[] result = action("input");
}
现在你可以像这样传递一个函数的引用给CallMe
方法:
doSomething.CallMe(MyAction.DoThis);
基于"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;
}
}
}
不确定我是否会推荐这种方法,但它有效!(例如,如果没有默认构造函数,这将失败)。
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");
}
}