Ich beginne mit Generika-Typen und ich bin mit meinem Projekt fest. Vielleicht habe ich Generika nicht sehr gut verstanden. Erklärungen wurden inline eingefügt. Im Grunde brauche ich den Do() -Methode zu implementieren, aber ich weiß nicht, wie < T2 zu lösen >:Casting generische Typen zu Unterklasse
public abstract class MyGenericClass<T> { }
public class MyGenericClass<T, T2> : MyGenericClass<T>
{
public Expression<Func<T, T2>> expression;
public MyGenericClass(Expression<Func<T, T2>> expression)
{
this.expression = expression;
}
}
public class MyClass<T>
{
// I need to mantain a list of my generic class for later use.
// I don't know T2 at this point.
// So I Chose to use Inheritance as a workaround (MyGenericClass<T> and MyGenericClass<T, T2>).
// Maybe it's not a good solution but I counldn't find out other solution.
public List<MyGenericClass<T>> MyGenericList = new List<MyGenericClass<T>>();
// I receive the parametric argument T2 here as part of an Expresion.
// And I keep the expression in my list.
public MyGenericClass<T, T2> ReceivingMethod<T2>(Expression<Func<T, T2>> expression)
{
MyGenericClass<T, T2> genericImp = new MyGenericClass<T, T2>(expression);
MyGenericList.Add(genericImp);
return genericImp;
}
}
public class Client<T>
{
MyClass<T> class1;
// class1 has been created and his field MyGenericList has beed populated.
// Then when I call Do()....
public void Do()
{
foreach (var item in class1.MyGenericList)
{
// ...I need something like this here,
// but it does not compile because I don't know T2 here.
// The caller of Do() method doesn't know T2.
MyGenericClass<T, T2> myGenericItem = (MyGenericClass<T, T2>)item;
var a = myGenericItem.expression;
}
}
}
Haben Sie darüber nachgedacht
Sie müssen an dieser Stelle Reflexion verwenden. Oder versuchen Sie wirklich, ein anderes Design herauszufinden. Mit Generics können Sie Code schreiben, der weitgehend unabhängig vom Typ ist, damit Sie nicht viele verschiedene Typen zusammen gruppieren können. – juharr
Wie wird 'Do'' 'MyGenericItem' verwenden? Wenn es nichts Spezifisches für "T2" zu tun braucht, dann können Sie abstrakte Methoden für 'MyGenericClass' definieren, das in der abgeleiteten Klasse implementiert ist und von 'Do' aufgerufen wird. –
KMoussa