在不使用接口的情况下从抽象超类中使用的泛型类型获取属性?

Getting properties from generic type used in abstract superclass without using interfaces?

有没有什么好的、优雅的方法可以在不使用接口的情况下从抽象超类中使用的泛型类型获取属性? 这是一个例子:

 public abstract class CoolBase<T>
    where T : class
{
    private IEnumerable<T> somEnumerable; 
    public void GetPersonProperties()
    {
       var name = somEnumerable.First().Name; //this doesn't work
    }

}

public class CoolA : CoolBase<Person>
{

}

public class Person
{
    public string Name { get; set; }
    public string Region { get; set; }
}

}

使用通用 classes 的目标是类型灵活性 - 因此在泛型 class 中声明一个方法是没有意义的 使用特定于人的方法。

你应该在具体实现中实现这么详细的方法 您的抽象通用 class(此处 CoolA)。

也许声明一个抽象方法 getProperties() 对你有帮助 int 通用的抽象 class,可以通过使用在 CoolA 中实现 特定于人的代码。

public abstract class CoolBase<T>
    where T : class
{
    private IEnumerable<T> somEnumerable; 

    public abstract void getProperties();    
}

public class CoolA : CoolBase<Person>
{    
    public override void getProperties()
    {
       //should work, somEnumberable is made of Persons here
       var name = somEnumerable.First().Name;
    }
}

GetPersonProperties放在CoolBase里是没有意义的。 CoolBase 是通用的,因此不应包含 class 特定的功能。

您可以在 CoolBase 中创建一个抽象方法并在您的派生类型中实现它:

public abstract class CoolBase<T> where T : class
{
    protected IEnumerable<T> somEnumerable;

    public abstract void GetProperties();
}

public class CoolA : CoolBase<Person>
{
    public override void GetProperties()
    {
        var name = somEnumerable.First().Name;
    }
}

public class Person
{
    public string Name { get; set; }
    public string Region { get; set; }
}

或者,您可以通过反射在运行时获取 T 的属性:

public abstract class CoolBase<T> where T : class
{
    private IEnumerable<T> somEnumerable;

    public void GetProperties()
    {
        foreach (var prop in typeof (T).GetProperties())
        {
            // do something with each property
        }
    }
}