繁体   English   中英

方法重载对象和未指定的类型

[英]Method overloads object and unspecified type

我有以下方法过载:

public string GetName(object obj)
{
    return obj.ToString();
}

public string GetName(CustomClass cc)
{
    return cc.Name + " - " + cc.Description;
}

现在,如果我使用拥有CustomClass的无类型IEnumerable调用该方法,则将调用GetName(object obj)来解决此问题,我修改了如下方法:

public string GetName(object obj)
{
    if (obj is CustomClass)
        return GetName(obj as CustomClass);

    return obj.ToString();
}

我认为编写20条IF语句并捕获所有其他可能性非常烦人,是否有一种更简单的方法可以使用无类型的IEnumerable枚举来调用正确的重载?

这是调用GetName(object obj)的代码:

IEnumerable rawData = GetData(); //DataBase method that fetches a CustomClass

foreach (var rawDataItem in rawData)
{
    Debug.Print(GetName(rawDataItem)); //calls the GetName(object obj) overload
}

请不要告诉我从CustomClass覆盖ToString,帮助我解决此方法调用问题。

好吧,您可以使用动态类型 这基本上会将重载解析推迟到执行时间:

foreach (dynamic rawDataItem in rawData)
{
    Debug.Print(GetName(rawDataItem));
}

请注意,这里可能存在性能成本-可能很小且无关紧要,但是值得注意。

编辑:要处理事情的递归方面,您可能想要两个不同的名称,例如GetNameGetNameImpl ,其中GetName委托给GetNameImpl ,这就是所有有用的重载都被调用的地方。 因此,您将拥有:

// Note that dynamic as a parameter type is equivalent to object for callers.
// The dynamic part is only relevant within the method.
public string GetName(dynamic obj)
{
    return GetNameImpl(obj);
}

// Fallback when no other overloads match
private string GetNameImpl(object obj)
{
    ...
}

private string GetNameImpl(IEnumerable obj)
{
    // Maybe build up the name by calling GetName on each element?
}

请注意,这存在一个潜在的问题:如果您对不同的接口有两个重载,并且一个类型实现了两个接口(但是该类型本身没有特定的重载),那么在执行时会遇到异常。

如果希望调用者能够直接调用重载,则可以将动态的一个重命名为GetNameDynamic ,而其他的重命名为GetName (并将它们公开)。

我很少发现, dynamic是一个很好的解决方案,但它避免代码重复。 我会尝试退后一步,说实话,找到其他设计。 您在问题中明确拒绝了它,但是多态处理此问题的首选方式。 您不必重写ToString您可以使所有自定义类型实现特定的接口,并在可用的情况下使用该接口。

return GetName((dynamic)obj);

将重载解析推迟到运行时。

如果没有动态类型,支持双调度的经典OOP解决方案(其中调用的方法取决于具有该方法的对象的具体类型和所传递对象的具体类型两者)是访问者模式

尝试这个:

public string GetName(object obj)
{
    if (!(obj is IEnumerable<object>))
        return GetName(obj as CustomClass);

    return obj.ToString();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM