使用不同的参数存储对稍后调用的方法的引用

时间:2014-12-20 16:54:30

标签: c# methods delegates wrapper

我需要能够对不同的方法进行一个变量类型存储引用,然后使用不同的参数调用它们,并让它们返回一些东西。每种方法都有不同的参数类型和输出类型。我试过代表,行动和Func。

下面的伪代码示例

  public void Open(String directory){
  File.Open(Directory);
  }
  public string ChangeVolume(int volume){
  //Code to change volume 
  //return the new volume
  }
public static void Main{
 MyVaribleType var1 = Open;
 myVaribleType var2 = ChangeVolume;
  var1("C:\Windows");
  Console.WriteLine(var2(100) );
}

如何使用单一变量类型实现此目的?

3 个答案:

答案 0 :(得分:0)

您可以保存对反射API提供的MethodInfo类集合中的方法的引用。为了能够调用这些方法,您还需要保留要在其上调用这些方法的对象的引用。您可以使用反射本身来调用这些方法。反射很慢,因此只有在您没有高性能要求时才能使用此方法。

答案 1 :(得分:0)

你不能按照自己的意愿去做:这两种方法有不同的签名,如@Mephy所说。不过你可以使用代理来完成它:

public delegate FileStream OpenFileHandler(string filePath);
public delegate string ChangeVolumeHandler(FileStream stream, int volume);

class Program
{
    private static FileStream Open(string filePath)
    {
        return File.Open(filePath, FileMode.OpenOrCreate);
    }
    private static string ChangeVolume(FileStream stream, int volume)
    {
        return "Done! Honest!";
    }
    static void Main(string[] args)
    {
        OpenFileHandler ofh = Program.Open;
        ChangeVolumeHandler cvh = Program.ChangeVolume;
        FileStream stream = ofh("path");
        string xyzzy = cvh(stream, 100);
    }
}

我不确定你为什么要这样做,但我认为这是一个相当复杂的要求,你已经表现得很好。

请注意,除了必须使用两个委托之外,您还必须传递它需要处理的每个项目以及它创建的项目(例如FileStream对象)。

答案 2 :(得分:0)

您可以使用ExpandoObject

dynamic d = new ExpandoObject();
d.ChangeVolume = new Func<int, string>(ChangeVolume);

然后这样称呼它:

var result = d.ChangeVolume(volume);  //ChangeVolume is type-checked at runtime.

或者直接将逻辑写入新的动态属性:

d.ChangeVolume = new Func<int, string>(x => (x * x).ToString()); // or whatever