Должен ли GetMember возвращать абстрактное свойство закрытого типа? - PullRequest
2 голосов
/ 03 февраля 2011

Я вижу два разных поведения, основанных на 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, и абстрактное закрытое свойство не возвращается ни в одном из случаев, что еще раз подтверждает, что первое поведение правильное.

1 Ответ

3 голосов
/ 03 февраля 2011

Я не уверен, почему это происходит.Я предполагаю, что вы видите RTM и SP1 CLR, и отражение имеет небольшую разницу / ошибку между двумя версиями.

Вы можете решить эту проблему, указав, что вы хотите PK член, который объявлен для определенного типа, который вы используете GetMembers, установив BindingFlags.DeclaredOnly.DeclaredOnly ограничит возвращаемые члены только теми членами, которые объявлены для определенного типа.Это отфильтрует любые члены, объявленные в родительских типах.

...