泛型类型的传递和使用,我可以做以下事情



我试图弄清楚如何在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");
    }
  }

相关内容

  • 没有找到相关文章

最新更新