【问题标题】:How to add function/method with ref parameter to Dicitonary-object?如何将带有 ref 参数的函数/方法添加到 Dictionary-object?
【发布时间】:2015-07-13 16:29:44
【问题描述】:

为了避免更大的 switch-case-block,我想添加(匿名)函数或方法到字典。这个过程已经有很多解释了。但是,我尝试存储的函数/方法必须采用引用参数

private static Dictionary<int, Func<ref object, string, bool>> someMethDict = 
    new Dictionary<int, Func<ref object, string, bool>>(){};

public static void Init ()
{
    someMethDict.Add(0, someMeth);
}

public static bool someMeth (ref object obj, string param)
{
    // do something
    return true;
}

此代码示例无法编译,因为 ref-keyword 是 Dictionary-instantiation 中的无效标记。

那么,我怎样才能在正确的 C# 中引诱编译器将这些方法与引用的参数一起存储到我的字典中?虽然我用了上面的Init-method来填写Dictionary,有没有办法在这种情况下直接用里面存储的函数/方法来实例化呢?

感谢您的帮助!

【问题讨论】:

  • 不能访问静态成员someMethDict.Add(0, someMeth);中的非静态成员
  • 另外someMeth 与已定义委托的签名不匹配。
  • @JenishRabadiya 你是对的。我错过了someMeth 的静态消息。

标签: c# function dictionary methods reference


【解决方案1】:

声明你自己的委托类型:

delegate bool MyDelegate (ref object obj, string param)

我希望我的语法正确。自从我上次使用 C# 语言的这一特性以来已经有很长一段时间了。由于引入了Func 类型,这很少有用。

【讨论】:

  • 这行得通。不过,在 C# 中,您可以使用内部的函数定义直接实例化 Dictionary 的解决方案会很好。不,它是可读的,但必须首先调用 Init 方法才能使其正常工作。
  • “使用函数定义直接实例化字典”是什么意思?您可以使用集合初始化程序。这使得语法更紧凑,并且不需要 Init 方法。
  • 嗯,好的,我使用的集合初始化器已经在稍微不同的环境中(没有委托)。我很惊讶像{EffectChangesEnum.Description, delegate(ref EffectChangesEnum def, string param){}} 这样的东西真的有效。
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2016-09-27
  • 2014-10-21
相关资源
最近更新 更多