从抽象超类中使用的泛型类型获取属性,而不使用接口

本文关键字:属性 接口 获取 抽象 超类 泛型类型 | 更新日期: 2023-09-27 18:02:07

是否有任何好的,优雅的方式从抽象超类中使用的泛型类型获得属性而不使用接口?下面是一个例子:

 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; }
}

}

从抽象超类中使用的泛型类型获取属性,而不使用接口

使用泛型类的目的是实现类型灵活性因此,在泛型类中声明方法是没有意义的使用针对个人的方法。

的具体实现中应该实现这些详细的方法您的抽象泛型类(这里是CoolA)。

声明一个抽象方法getProperties()可能对你有帮助int泛型抽象类,它可以在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是通用的,所以不应该在它里面有特定于类的功能。

您可以在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
        }
    }
}