SORU
11 Aralık 2008, PERŞEMBE


() GetProperties arabirimi devralma hiyerarşisi için tüm özelliklerini dönmek için

Aşağıdaki varsayımsal miras hiyerarşisini varsayarsak:

public interface IA
{
  int ID { get; set; }
}

public interface IB : IA
{
  string Name { get; set; }
}

Yansıma kullanarak ve aşağıdaki kararı:

typeof(IB).GetProperties(BindingFlags.Public | BindingFlags.Instance)

sadece arayüz özelliklerini verim olan IB, "Name".

Eğer aşağıdaki kodu benzer bir test yapacak olursak

public abstract class A
{
  public int ID { get; set; }
}

public class B : A
{
  public string Name { get; set; }
}

typeof(B).GetProperties(BindingFlags.Public | BindingFlags.Instance) PropertyInfo nesneleri dizisi döndürür çağrısı için "ID" ve "Name".

Kolay bir şekilde ilk örnekte olduğu gibi arabirimler için devralma hiyerarşisinde tüm özellikleri var mı?

CEVAP
14 Mart 2010, Pazar


@Uzantısı yararlı bir yöntem haline Marc Çakıl örnek kod, sınıfları ve ARAYÜZLERİ saklar yükselttim. Ayrıca inanıyorum ki ilk arayüz özellikleri beklenen davranıştır ekleyin.

public static PropertyInfo[] GetPublicProperties(this Type type)
{
    if (type.IsInterface)
    {
        var propertyInfos = new List<PropertyInfo>();

        var considered = new List<Type>();
        var queue = new Queue<Type>();
        considered.Add(type);
        queue.Enqueue(type);
        while (queue.Count > 0)
        {
            var subType = queue.Dequeue();
            foreach (var subInterface in subType.GetInterfaces())
            {
                if (considered.Contains(subInterface)) continue;

                considered.Add(subInterface);
                queue.Enqueue(subInterface);
            }

            var typeProperties = subType.GetProperties(
                BindingFlags.FlattenHierarchy 
                | BindingFlags.Public 
                | BindingFlags.Instance);

            var newPropertyInfos = typeProperties
                .Where(x => !propertyInfos.Contains(x));

            propertyInfos.InsertRange(0, newPropertyInfos);
        }

        return propertyInfos.ToArray();
    }

    return type.GetProperties(BindingFlags.FlattenHierarchy
        | BindingFlags.Public | BindingFlags.Instance);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmmightySofia

    EmmightySofi

    25 EYLÜL 2011
  • Kindness

    Kindness

    23 Ocak 2006
  • Tinkernut

    Tinkernut

    28 Aralık 2006