关于generics,inheritance和链接的棘手问题

对于上下文 – 阅读本文 。

问题:

class Program { static void Main() { var b = new bar(); b.buzz().fizz().buzz().fizz(); //cool // ^FAIL!!!...<------------------------------------ Console.ReadLine(); } } public class foo { public foo fizz() { return this; } } public class bar : foo { public bar buzz() { return this; } } 

解:

  class Program { static void Main() { var b = new bar(); b.buzz().fizz().buzz().fizz(); //cool stuff Console.ReadKey(); } } public static class fooExtensions { public static T fizz(this T t) where T : foo { return t; } } public class foo{} public class bar : foo { public bar buzz() { return this; } } 

这是一种技术如何“模仿”能够返回派生类型的基类方法(否则我的b不能再次调用buzz())。

更进一步,使foo / bar通用(这仍然可以正常工作):

  class Program { static void Main() { var b = new bar(); b.buzz().fizz().buzz().fizz(); //cool Console.ReadLine(); } } public static class fooExtensions { public static T fizz(this T t) where T : foo { return t; } } public class buzz { public string name { get; set;} } public class foo where T : buzz {} public class bar : foo where T : buzz { public bar buzz() { return this; } } 

问题是 –
如何将lambda传递给知道tbuzz及其属性的fizz方法,而不显式传递类型参数

破碎的代码可能反映了我正在寻找的东西:

 class Program { static void Main() { var b = new bar(); b.buzz().fizz(x=>x.name).buzz().fizz(); //not cool anymore // ^FAIL!!!<--------------------------------- Console.ReadLine(); } } public static class fooExtensions { //NO IDEAS WHAT TO WRITE BELOW!!! public static T fizz(this T t, Func superlambda) where T : foo where Tbuzz : buzz { return t; } } public class buzz { public string name { get; set;} } public class foo where T : buzz {} public class bar : foo where T : buzz { public bar buzz() { return this; } } 

想知道这是否可能。 如果没有 – 为什么?

从理论上讲 – foo知道下面有一个buzz

有没有其他方法如何创建基本方法或模仿它支持链接这样的类?

我不认为你想要完成的是可能的。 从理论上讲,你需要的是某种约束,如:

 where TBuzz : T 

意思是TBuzz需要是T的内部generics类型。据我所知,这是不可能的。

这个?

 class Program { static void Main(string[] args) { var b = new bar(); var a = b.buzz().fizz(x => x.name).buzz().fizz(); Console.ReadLine(); } } public static class fooExtensions { public static T fizz(this T t) where T : foo { return t; } public static T fizz(this T t, Func superlambda) where T : foo { return t; } } public class foo { public string name { get; set; } } public class bar : foo { public bar buzz() { return this; } } 

起初我以为我用一种画眉组合器取得了进步

 public static T fizz(this T t, Func f) { return f(t); } 

但这似乎是一个死路一条。 无论如何都要发布它,以防你可以改进它。