7

我试图弄清楚如何访问CallMe<T>()class中的静态方法DoSomething。反射是这里唯一的解决方案吗?我不想实例化类型的对象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;
        }
    }
4

4 回答 4

9

用 定义一个接口DoThisMyAction实现它,并将T类型参数约束为它的一个实例where T : IMyInterface

于 2012-12-21T12:30:45.413 回答
2

如果您的DoThis方法需要是静态的,您还可以将CallMe方法更改为以下内容:

public void CallMe(Func<string, byte[]> action)
{
    byte[] result = action("input");
}

现在您可以将函数的引用传递给CallMe方法,如下所示:

 doSomething.CallMe(MyAction.DoThis);
于 2012-12-21T12:35:57.373 回答
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;
    }
}
}

不确定我会推荐这种方法,但它有效!(例如,如果没有默认构造函数,这将失败)。

于 2012-12-21T15:11:29.137 回答
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");
    }
  }
于 2012-12-21T13:07:38.083 回答