选择基于返回类型的调用结构

时间:2014-04-30 17:42:07

标签: c# class methods

我确信对于有经验的程序员来说这是一个简单的问题,但我以前从未这样做过 - 假设我有一个自定义对象,如下所示:

public class MyClass
{       
    public Dictionary<string,string> ToDictString()
    {
        Dictionary<string,string>  retval = new Dictionary<string,string>;
        // Whatever code
        return retval;
    }

    public Dictionary<string,int> ToDictInt()
    {
        Dictionary<string,int>  retval = new Dictionary<string,int>;
        // Whatever code
        return retval;
    }

}

所以,在我的代码中,我可以编写如下内容:

MyClass FakeClass = new MyClass();
Dictionary<string,int> MyDict1 = FakeClass.ToDictInt();
Dictionary<string,string> MyDict2 = FakeClass.ToDictString();

这样做很好,但我希望能够在MyClass中调用一个方法,比如ToDict()可以返回任何类型的字典,具体取决于预期返回类型

所以,例如,我会:

MyClass FakeClass = new MyClass();

// This would be the same as calling ToDictInt due to the return type:
Dictionary<string,int> MyDict1 = FakeClass.ToDict();

// This would be the same as calling ToDictString due to the return type:
Dictionary<string,string> MyDict2 = FakeClass.ToDict();    

所以,一个方法名称,但它根据要返回的变量知道要返回什么...如何在我的类中编写方法来执行此操作?

非常感谢!!

2 个答案:

答案 0 :(得分:6)

这是不可能的。重载决策算法不考虑方法调用表达式的上下文,因此在您提到的示例中会导致歧义错误。

要使方法具有不同的返回类型,您需要有两个不同的方法名称(或参数列表中的差异)。

答案 1 :(得分:2)

您可以使用泛型来实现接近您想要的东西

public Dictionary<string,T> ToDict<T>()
{
    Dictionary<string,T>  retval = new Dictionary<string,T>();
    // Whatever code
    return retval;
}

使用时需要指定类型参数

var result = myClass.ToDict<int>();

这会将返回类型限定符从方法名称移动到类型参数,并且由于@Servy提到的问题,它是您可以获得的最接近的。