2015-07-11 51 views
1

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

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

如果你想在'CoolBase'中获得'Person'的详细信息,那么'CoolBase'不能是通用的,它需要知道'Person'。如果你想'CoolBase'是通用的,那么你不需要特定于'Person'的代码。 –

回答

0

这是没有意义的把GetPersonPropertiesCoolBaseCoolBase是通用的,所以在它内部不应该有类特定的功能。

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

使用通用类的目标是类型灵活性 - 因此 它没有SENCE其中 使用特定人的方法的通用类声明的方法。

您应该在您的抽象泛型类(此处为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; 
    } 
}