Ich muss Methodenüberladungen nach dem Typ des Objekts zur Laufzeit mit C# späten Bindungsfunktionen aufrufen. Es funktioniert gut, wenn alle Überladungen in der gleichen Klasse definiert sind, in der der Anruf stattfindet. Wenn jedoch eine Überladung in einer abgeleiteten Klasse definiert ist, wird sie zur Laufzeit nicht gebunden.C# späten Bindungsmethode Überladungen funktioniert nicht, wenn Überladung in einer abgeleiteten Klasse definiert ist
class BaseT
{}
class DerivedA : BaseT
{}
class DerivedB : BaseT
{}
class Generator
{
public void Generate(IEnumerable<BaseT> objects)
{
string str = "";
foreach (dynamic item in objects)
{
str = str + this.Generate(item); //throws an exception on second item
}
}
protected virtual string Generate(DerivedA a)
{
return " A ";
}
}
class DerivedGenertor : Generator
{
protected virtual string Generate(DerivedB b)
{
return " B ";
}
}
class Program
{
static void Main(string[] args)
{
List<BaseT> items = new List<BaseT>() {new DerivedA(), new DerivedB()};
var generator = new DerivedGenertor();
generator.Generate(items);
}
}
Hier ist ein weiteres klares Beispiel:
class BaseT
{}
class DerivedA : BaseT
{}
class DerivedB : BaseT
{}
class DerivedC : BaseT
{ }
class Generator
{
public void Generate(IEnumerable<BaseT> objects)
{
string str = "";
foreach (dynamic item in objects)
{
str = str + this.Generate(item); //throws an exception on third item
}
}
public virtual string Generate(DerivedA a)
{
return " A ";
}
public virtual string Generate(DerivedC c)
{
return " C ";
}
}
class DerivedGenertor : Generator
{
public virtual string Generate(DerivedB b)
{
return " B ";
}
}
class Program
{
static void Main(string[] args)
{
List<BaseT> items = new List<BaseT>() {new DerivedA(), new DerivedC(), new DerivedB()};
dynamic generator = new DerivedGenertor();
generator.Generate(items);
}
}
'DerivedGenertor.Generate' ist" geschützt ", daher ist es nicht von der' Generator' Klasse aus zugänglich. – PetSerAl
Was genau ist der zweite Gegenstand? – MikeG