C# 存储对稍后使用不同参数调用的方法的引用
我需要能够有一个变量类型存储对不同方法的引用,然后稍后使用不同的参数调用它们,并让它们返回一些东西。每个方法都有不同的参数类型和输出类型。我尝试过委托、操作和函数 下面的伪代码示例C# 存储对稍后使用不同参数调用的方法的引用,c#,methods,delegates,wrapper,C#,Methods,Delegates,Wrapper,我需要能够有一个变量类型存储对不同方法的引用,然后稍后使用不同的参数调用它们,并让它们返回一些东西。每个方法都有不同的参数类型和输出类型。我尝试过委托、操作和函数 下面的伪代码示例 public void Open(String directory){ File.Open(Directory); } public string ChangeVolume(int volume){ //Code to change volume //return the new volum
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) );
}
使用单个变量类型如何实现这一点?您可以在反射API提供的MethodInfo类集合中保存对方法的引用。为了能够调用这些方法,还需要保留要调用这些方法的对象的引用。您可以使用反射本身来调用这些方法。反射速度很慢,因此只有在性能要求不高的情况下才能使用此方法。您不能完全按照自己的意愿进行操作:正如@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对象)。您可以使用
ExpandoObject
:
dynamic d = new ExpandoObject();
d.ChangeVolume = new Func<int, string>(ChangeVolume);
或者直接将逻辑写入新的动态属性:
d.ChangeVolume = new Func<int, string>(x => (x * x).ToString()); // or whatever
d.ChangeVolume=newfunc(x=>(x*x).ToString());//或者别的什么
您不能真正做到这一点。两种不同的类型不能有一个“变量类型”void
不是string
,string
不是int
。但是,您可以将签名更改为object-Method(object[]params)
以尽可能通用,但我并不建议这样做。请告诉我们您试图解决的问题。也许有比这更好的解决方法,这是人工智能。当人工智能看到一个单词时,它必须进入内存并搜索该单词,然后执行与该单词相关联的操作/方法,但是与该单词相关联的操作可能会改变(学习人工智能,或者我手动更改它)。这非常有效,但我还不知道速度是否会成为一个问题。谢谢另外,发布新的工作代码以供他人查看也是一种很好的做法。这是我关于堆栈溢出的第一个答案,我正在手机上使用它。
d.ChangeVolume = new Func<int, string>(x => (x * x).ToString()); // or whatever