Pour le contexte - read this.Question délicate sur les génériques, l'héritage et le chaînage
Problème:
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;
}
}
Solution:
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;
}
}
Ceci est une technique comment la méthode 'mimétique' de classe de base qui est en mesure de retourner type dérivé collationnée (sinon mon b ne pouvait pas appelez encore le buzz().
aller plus loin et faire foo/bar générique (cela fonctionne toujours très bien):
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;
}
}
Et la question est -
comment passer lambda à la méthode fizz
qui connaît tbuzz
et c'est propriétés sans passer paramètre/s explicitement.
code cassé qui pourrait refléter ce que je cherche:
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;
}
}
Vous vous demandez si cela est possible. Et si non - pourquoi? Théoriquement - foo<T>
sait qu'il y a un buzz
en dessous.
Existe-t-il une autre approche pour créer une méthode de base ou imiter celle-ci qui supporte le chaînage pour de telles classes?
On dirait que le problème est d'inférer le type 'Tbuzz' pour' fizz ', qui n'est pas connecté du tout avec' foo '. Par curiosité, j'ai essayé de changer la contrainte sur T en 'où T: Foo ' en vain. –
outis
Comme je l'ai écrit - ces lignes sont brisées. J'ai compris que fizz n'est pas connecté aussi. La question est - peuvent-ils être connectés et sinon - pourquoi? –