簡體   English   中英

使用反射將未知對象轉換為泛型類

[英]Using reflection to cast unknown object to generic class

我有一個將對象作為參數的方法。 在該方法中,我將通過反射遍歷對象的屬性。 一些屬性屬於通用類類型。 我喜歡讀取該泛型類屬性的屬性,但是無法將其強制轉換為泛型類。

public abstract class BaseClass
{
    public int Id { get; set; }
}

public abstract class GenericClass<T>: BaseClass
{
    public string Description { get; set; }
}

public class DerivedClassA: GenericClass<DerivedClassA>
{
    public string A { get; set; }
}

public class DerivedClassB: GenericClass<DerivedClassB>
{
    public string B { get; set; }
}

public class ReflectingClass: BaseClass
{
    public string Code { get; set; }
    public DerivedClassA DerA { get; set; }
    public DerivedClassB DerB { get; set; }
}

public static void Reflecting(object obj)
{
    var t = GetType(obj)
    foreach (var pi in t.GetProperties())
    {
        if (obj.GetType().BaseType.GetGenericTypeDefinition() == typeof(GenericClass<>)
        {
            var genClassObjProperty = ((GenericClass<T>)obj).Description; // Error, cannot do this at all !!!
        }
    }
}

我想要的是使代碼轉到屬性,無論派生類實際上是什么,都將從其派生的GenericClass獲得Description屬性。

我使用的是泛型類,因為在代碼的其他地方,我通過其派生類調用方法並獲得適當的類類型,而無需訴諸各種類型的轉換和傳遞類型。 即:

DerivedClassA.DoSomething() 

代替

BaseClass.DoSomething<DerivedClassA>()

要么

BaseClass.DoSomething(type derivedClassType)

看看這個:

public static void Reflecting(object obj)
{
    foreach (var pi in obj.GetType().GetProperties())
    {
        if (pi.PropertyType.BaseType.IsGenericType
            && pi.PropertyType.BaseType.GetGenericTypeDefinition()
            == typeof(GenericClass<>))
        {
            var propValue = pi.GetValue(obj);
            if (propValue != null)
            {
                var description = propValue.GetType()
                    .GetProperty("Description").GetValue(propValue);
                Console.WriteLine(description);
            }
        }
    }
    Console.ReadKey();
}

我認為這就是您所需要的。

暫無
暫無

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

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