Мне нужно вызывать перегрузки методов в соответствии с типом объекта во время выполнения, используя функции позднего связывания С#. Он отлично работает, когда все перегрузки определены в том же классе, что и вызов. Но когда перегрузка определена в производном классе, она не будет привязана во время выполнения.
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);
}
}
Вот еще один более наглядный пример:
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
— этоprotected
, поэтому он недоступен из классаGenerator
. - person user4003407   schedule 09.09.2015