Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储对稍后使用不同参数调用的方法的引用_C#_Methods_Delegates_Wrapper - Fatal编程技术网

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