如何使方法采用2种不同的类型

Kri*_*rip 4 c# generics overloading

我知道这可能是一个非常简单的问题,但我现在有一个脑屁.我正在尝试创建一个可以采用2种自定义类型之一的方法.基本上这个方法的主体对于两种类型都是相同的,因为它们都具有Name属性(我在Name属性上进行比较以用于排序).我该怎么做?

我的第一个想法是用两种类型作为参数重载方法:

int Compare(Type1 first, Type1 second)
int Compare (Type2 first, Type2 second)
Run Code Online (Sandbox Code Playgroud)

但这些方法的主体最终是相同的,因此它似乎是一种浪费.

我的下一个想法是使用泛型,但这似乎并不正确,因为我不是真正使它通用,因为它只能用于2种特定类型.

澄清:"自定义"类型实际上不是我的自定义类型.我的意思是他们不是内置类型.我无法控制这些类型或继承层次结构中的内容.他们碰巧都有Name属性.

Eri*_*ert 8

奇怪的是到目前为止还没有人发布我认为是明显的选择:将名称作为比较的参数.使调用者从对象中获取name属性.如果需要使用的所有方法都是名称,那么为什么要传递对象的其余部分呢?

如果你需要抽象出"我能从这个东西中得到一个名字"这个概念,那么就这样做:

例:

int Compare(string name1, string name2) { ... whatever ... }
int Compare<T>(T t1, T t2, Func<T, string> getName)
{
    return Compare(getName(t1), getName(t2));
}
Run Code Online (Sandbox Code Playgroud)

现在你可以说:

Compare(car1, car2, c=>c.Name);
Compare(employee1, employee2, e=>e.Name);
Run Code Online (Sandbox Code Playgroud)

等等.


Ant*_*ram 7

如果两个类型派生自相同的基础或使用相同的接口,并且没有其他类使用基础和/或接口,则通用仍然是一个选项.

int Compare<T>(T first, T second) where T : IHasName
Run Code Online (Sandbox Code Playgroud)

没有这个,有两个重载是要走的路.

注意:如果你有.NET 4,你可以使它成为运行时事物并使方法动态化.

int Compare(dynamic first, dynamic second)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你抛出的任何东西都会编译,但如果Name属性不存在,它会在运行时爆炸.

就个人而言,如果我不能修改类型以使用通用接口,那么我会使用重载并获得编译时的安全性.

  • 使两种类型实现一个共同的界面似乎是去恕我直言的方式. (2认同)