有没有漂亮,优雅的方法从抽象超类中使用泛型类型获取属性而不使用接口? 这是一个例子:
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; }
}
}
答案 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
}
}
}