我喜欢这个简单的工具:
public static class Klass
{
public static Klass<T> Of<T>(){ return Klass<T>.instance; }
}
public class Klass<T>
{
public static Klass<T> instance = null;
}
现在您可以:
public K Process<T,K>(Klass<T> t, IEnumerable<K> items)
{
....
}
var aKey = Process(Klass.Of<string>(), mySetOfItems);
// aKey will be autotyped to a string
但请注意,这需要在 Process 方法中添加一个未使用的参数。此参数仅用于解决缺少的类型。这就是“实例”始终为空的原因。该值并不重要,重要的是这个 null 是 Klass 类型。
但是,请注意,这 100% 可以避免使用像 in 这样的显式类型参数,Process<string, ....>
因为您不需要显式传递<string>
类型参数。因此,所有类型参数都绑定到参数,这允许编译器自动解析匿名类型,包括 IEnumerable 的项目。
编辑:我刚刚还记得一件事,尽管更复杂和棘手。匿名类型是完全鸭式的。这意味着具有“string Key, int Value”的一个匿名类型与在其他地方创建的第二个匿名类型绝对属于同一类,后者也是“string Key, int Value”。这使您可以创建此处描述的小型辅助方法CastByExample。
通常,您不能“指定”匿名类型,因为它是未命名的,并且您不能写出它的名称。但是,多亏了鸭子类型,这篇珍贵的文章展示了如何提供一个从不执行的 lambda,它返回一个“样本”匿名对象,只是为了拦截它定义的匿名类型,以便可以将类型传递给表达式链。非常特殊,但有趣的事情!