我需要能够对不同的方法进行一个变量类型存储引用,然后使用不同的参数调用它们,并让它们返回一些东西。每种方法都有不同的参数类型和输出类型。我试过代表,行动和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) );
}
如何使用单一变量类型实现此目的?
答案 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