通用类型传递和使用,我可以执行以下操作吗?

时间:2012-12-21 12:28:43

标签: c# generics reflection interface

我试图找出如何在类CallMe<T>()的{​​{1}}内访问静态方法。反思是唯一的解决方案吗?我不想实例化DoSomething类型的对象。另外,如果通过反射进行,有一种方法可以通过方法MyAction中的反射一次创建方法,然后多次调用它来对同一个“反射”方法执行多个操作?或者有没有比通过反思更好的方式?我基本上想要创建模板实现样式类,例如CallMe<T>(),定义MyAction如何履行其职责。然后,byte[] DoThis(string text)将指定正在使用的模板,并根据AskForSomething()进行其工作。

CallMe<T>()

4 个答案:

答案 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");
    }
  }