Я вижу два разных поведения, основанных на CLR, под которым запускается мое приложение. В одном случае он возвращает абстрактное свойство закрытого типа, а в другом - нет. Поскольку свойство является абстрактным, кажется, что первое правильно.
Я протестировал, скомпилировав в VS2010 следующую информацию для .NET-3.5 SP1, а затем скопировав физический исполняемый файл на другой компьютер с другой минорной ревизией CLR:
public abstract class BaseEntity<TId>
{
public abstract TId PK { get; set; }
}
public class DerivedEntity : BaseEntity<int>
{
public override int PK { get; set; }
}
class Program
{
static void Main(string[] args)
{
var derivedEntity = new DerivedEntity();
var type = derivedEntity.GetType();
var flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty;
foreach (var memberInfo in type.GetMember("PK", flags))
{
Console.WriteLine(
"Member: " + memberInfo.Name
+ " from " + memberInfo.DeclaringType);
}
Console.WriteLine("Running : " + Environment.Version);
Console.WriteLine("mscorlib: " + typeof(int).Assembly.GetName().Version);
}
}
На машине под управлением 2.0.50727.4952 я вижу следующий вывод:
Member: PK from MemberInfoTest.DerivedEntity
Running : 2.0.50727.4952
mscorlib: 2.0.0.0
На машине под управлением 2.0.50727.3615 я получаю другой вывод:
Member: PK from MemberInfoTest.DerivedEntity
Member: PK from MemberInfoTest.BaseEntity`1[System.Int32]
Running : 2.0.50727.3615
mscorlib: 2.0.0.0
Вышеуказанные различия вызывают AmbiguousMatchException
при различных обстоятельствах. Какое из этих поведений правильное и есть ли «исправление» для другого?
РЕДАКТИРОВАТЬ: Я только что протестировал нацеливание на среду выполнения CLR-4, и абстрактное закрытое свойство не возвращается ни в одном из случаев, что еще раз подтверждает, что первое поведение правильное.