C# - 我怎样才能 "overload"委托(delegate)?

标签 c# delegates overloading

首先,我阅读了一些论坛和 MSDN 中的帮助,它们都说代理不能重载。

现在,我想要这样的东西:

public delegate void OneDelegate();
public delegate void OneDelegate(params object[] a);

public void DoNothing(params object[] a) {}
public void DoSomething() { /* do something */ }

private OneDelegate someFunction;

someFunction = new OneDelegate(DoSomething);
someFunction = new OneDelegate(DoNothing);

所以,如您所知,您不能这样做,因为 OneDelegate 仅引用第一个而不是第二个。但是,有没有办法做到这一点?还是类似的东西?

PS1:我想要任意数量的 OneDelegate 声明,而不仅仅是一两个。

最佳答案

想象一下这是可能的。假设我可以有一个重载委托(delegate):

public delegate void OneDelegate(int i);
public delegate void OneDelegate(string s);

现在假设我声明了一个这种类型的变量,然后为其分配了一个函数,例如:

OneDelegate myDelegate = StringMethod;

StringMethod 是这样声明的:

public void StringMethod(string s) { Console.WriteLine(s); }

现在您将 myDelegate 传递给其他代码,该代码执行以下操作:

myDelegate(47);

您希望在这种情况下发生什么?运行时如何使用整数参数调用 StringMethod()

如果您真的想要一个可以接受任何参数集的委托(delegate),那么唯一的选择就是使用一个params object[]数组:

public delegate void OneDelegate(params object[] parameters);

但是你必须给它分配一个可以实际处理任何对象数组的函数,例如:

public void MyMethod(params object[] parameters)
{
    if (parameters == null || parameters.Length == 0)
        throw new ArgumentException("No parameters specified.");
    if (parameters.Length > 1)
        throw new ArgumentException("Too many parameters specified.");

    if (parameters[0] is int)
        IntMethod((int) parameters[0]);
    else if (parameters[0] is string)
        StringMethod((string) parameters[0]);
    else
        throw new ArgumentException("Unsupported parameter type.");
}

如您所见,这很快就会变得一团糟。因此,我向您提出,如果您需要这样的委托(delegate),您可能在架构设计的某个地方犯了错误。在继续实现之前识别此缺陷并修复设计,否则代码的可维护性将受到影响。

关于C# - 我怎样才能 "overload"委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3747948/

相关文章:

javascript - 在 C#/Javascript.net/V8 上运行 Less.js

c# - 无法将类型为 'NHibernate.Hql.Ast.HqlCast' 的对象转换为类型“NHibernate.Hql.Ast.HqlBooleanExpression”

iOS UiPickerView(-Helper) 应发送消息

c++ - 使用和重载基类的模板成员函数?

c++ - 获取错误 : no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'Complex' ) despite overloading the << operator

C# dll 中的 C# 转换异常

c# - 如何使用 Moq.MockRepository.Of() 方法

c# - 属性的内部 setter 可以序列化吗?

iphone - 找不到我的自定义委托(delegate)的协议(protocol)声明

objective-c - 协议(protocol)方法的默认值是可选的还是必需的?