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

时间:2015-07-11 09:39:00

标签: c# generics abstract-class

有没有漂亮,优雅的方法从抽象超类中使用泛型类型获取属性而不使用接口? 这是一个例子:

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

}

2 个答案:

答案 0 :(得分:1)

使用泛型类的目标是类型灵活性 - 因此,它无法在泛型类中声明一个方法 使用特定于人的方法。

你应该在具体实现中实现这些详细的方法 你的抽象通用类(这里是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;
    }
}

答案 1 :(得分:0)

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