上下文 - read this .
问题:
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<T>(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<buzz>();
b.buzz().fizz().buzz().fizz(); //cool
Console.ReadLine();
}
}
public static class fooExtensions
{
public static T fizz<T>(this T t) where T : foo<buzz>
{ return t; }
}
public class buzz { public string name { get; set;} }
public class foo<T> where T : buzz
{}
public class bar<T> : foo<T> where T : buzz
{
public bar<T> buzz()
{
return this;
}
}
问题是-
如何将 lambda 传递给 fizz
知道 tbuzz
的方法并且它的属性没有显式传递类型参数。
可能反射(reflect)我正在寻找的内容的损坏代码:
class Program
{
static void Main()
{
var b = new bar<buzz>();
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<T, Tbuzz>(this T t,
Func<Tbuzz, object> superlambda)
where T : foo<buzz>
where Tbuzz : buzz
{
return t;
}
}
public class buzz { public string name { get; set;} }
public class foo<T> where T : buzz
{}
public class bar<T> : foo<T> where T : buzz
{
public bar<T> buzz()
{
return this;
}
}
想知道这是否可能。如果不是——为什么?
理论上 - foo<T>
知道有一个 buzz
下。
有没有其他方法可以创建或模拟支持此类类链接的基方法?
最佳答案
我不认为你想要完成的是可能的。从理论上讲,您需要的是某种约束,例如:
where TBuzz : T<inner>
意味着 TBuzz 必须是 T 的内部泛型类型。据我所知,这是不可能的。
关于c# - 关于泛型、继承和链接的棘手问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1604382/