簡體   English   中英

在C#中使用Reflection獲取BaseType屬性

[英]Get BaseType properties with Reflection in C#

我需要列出包含類的所有屬性,我有很多,所以我不知道代碼中的類型,但是我可以通過prop.BastType.FullName來獲取它,但是我不能進行強制轉換,並且我不想更改所有類以創建每個“鑄造”方法。 為了避免打印諸如DeclaringType,ReflectedType等的Property Properties,我在代碼中排除了它們,但是我不喜歡這種方式...

if (("DeclaringType,ReflectedType,MetadataToken,Module,PropertyType,Attributes,CanRead" +
                    ",CanWrite,GetMethod,SetMethod,IsSpecialName,CustomAttributes,MemberType")
                    .Contains(prop.Name))
                    continue;

方法的完整代碼:

private static void GetAllPropertiesFor(object oo, int level, List<KeyValuePair<string,string>> result)
{
    Type entType = oo.GetType();
    IList<PropertyInfo> props = new List<PropertyInfo>(entType.GetProperties());
    foreach (PropertyInfo prop in props)
    {
        object propValue = prop.GetValue(oo, null);
        if (("DeclaringType,ReflectedType,MetadataToken,Module,PropertyType,Attributes,CanRead" +
            ",CanWrite,GetMethod,SetMethod,IsSpecialName,CustomAttributes,MemberType")
            .Contains(prop.Name))
            continue;
        if (propValue == null)
        {
            result.Add(new KeyValuePair<string, string>((new string(' ', level * 2)) + prop.Name, "Object"));
            //GetAllPropertiesFor(prop, level + (1*3), result);
        }
        else
        {
            if (result == null) result = new List<KeyValuePair<string, string>>();
            result.Add(new KeyValuePair<string, string>((new string(' ', level)) + prop.Name, propValue.ToString()));
        }
        if (entType.Namespace == "System.Data.Entity.DynamicProxies" && entType.BaseType.FullName.StartsWith("RE2012.Data.Models."))
        {
            GetAllPropertiesFor(prop, level + 1, result);
        }
        // Do something with propValue
    }
}

有什么建議么?

這樣我沒有結果,值:

PropertyType : System.Int32
Attributes : None
CanRead : True
CanWrite : True

正是我所需要的。

免責聲明 我無法真正解決您想要的東西,所以此答案只是在黑暗中拍攝

基於我的理解,您希望從特定的類中獲取屬性,因此這是我的示例:

首先,我的繼承

class BaseClass
{
    public int Base { get; set; }
}
class ChildClass : BaseClass
{
    public double Child { get; set; }
}
class ChildChildClass : ChildClass
{
    public string ChildChild { get; set; }
}

現在讓我們查找單個屬性

class Program
{

    static void Main(string[] args)
    {
        var obj = new ChildChildClass();

        var ChildChildType = obj.GetType();

        var p = new Program();

        // here we get the ChildClass properties
        var t = p.getBaseType(ChildChildType, 1);
        Console.WriteLine(t.Name);
        p.getproperties(t);

        // here we get the BaseClass properties
        t = p.getBaseType(ChildChildType, 2);
        Console.WriteLine(t.Name);
        p.getproperties(t);

        // here we get the Object properties
        t = p.getBaseType(ChildChildType, 3);
        Console.WriteLine(t.Name);
        p.getproperties(t);

        Console.Read();
    }

    internal Type getBaseType(Type t, int level)
    {
        Type temp ;
        for (int i = 0; i < level; i++)
        {
            temp = t.BaseType;
            if(temp == null)
                throw new ArgumentOutOfRangeException("you are digging to deep");
            else
                t = temp;
        }

        return t;
    }

    private void getproperties(Type t)
    {
        PropertyInfo[] properties = t.GetProperties(BindingFlags.DeclaredOnly |
                                                    BindingFlags.Public |
                                                    BindingFlags.Instance);

        foreach (PropertyInfo property in properties)
        {
            Console.WriteLine(property.Name);
        }

        Console.WriteLine("");
    }
}

如果你想了解的BindingFlags一些信息是一個鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM