2012-08-23 38 views
11

tôi có ba lớp như sau:Làm cách nào để lấy tham số kiểu chung của lớp cơ sở?

public class TestEntity { } 

public class BaseClass<TEntity> { } 

public class DerivedClass : BaseClass<TestEntity> { } 

Tôi đã có được đối tượng System.Type của DerivedClass sử dụng phản ánh trong thời gian chạy. Làm cách nào để có được đối tượng System.Type của TestEntity bằng cách sử dụng phản chiếu?

Cảm ơn.

Trả lời

19

Tôi cho rằng mã của bạn chỉ là mẫu và bạn không biết rõ ràng DerivedClass.

var type = GetSomeType(); 
var innerType = type.BaseType.GetGenericArguments()[0]; 

Lưu ý rằng mã này có thể thất bại một cách dễ dàng tại thời gian chạy, bạn nên kiểm tra xem loại mà bạn xử lý là những gì bạn mong đợi nó sẽ:

if(type.BaseType.IsGenericType 
    && type.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>)) 

Cũng có thể có sâu cây thừa kế vì vậy một số vòng lặp với điều kiện trên sẽ được yêu cầu.

+0

Tôi nhận được đối tượng kiểu DerivedClass một cách động, vì vậy không thể mã hóa cứng. Tôi đã giải quyết. – lucn

+0

Tôi đã không mã cứng 'DerivedClass' có sơ khai' var type = GetSomeType(); ' – Rafal

+0

Vâng, điều này là đúng. – lucn

0
var derivedType = typeof(DerivedClass); 
var baseClass = derivedType.BaseType; 
var genericType = baseClass.GetGenericArguments()[0]; 
0

Nó nghĩ rằng đây sẽ làm việc:

var firstGenericArgumentType = typeof(DerivedClass).BaseType.GetGenericArguments().FirstOrDefault(); 

Hoặc

var someObject = new DerivedClass(); 
var firstGenericArgumentType = someObject.GetType().BaseType.GetGenericArguments().FirstOrDefault(); 
2

Bạn có thể sử dụng thuộc tính BaseType. Mã sau sẽ có khả năng phục hồi các thay đổi trong kế thừa (ví dụ: nếu bạn thêm một lớp khác ở giữa):

Type GetBaseType(Type type) 
{ 
    while (type.BaseType != null) 
    { 
     type = type.BaseType; 
     if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(BaseClass<>)) 
     { 
      return type.GetGenericArguments()[0]; 
     } 
    } 
    throw new InvalidOperationException("Base type was not found"); 
} 

// to use: 
GetBaseType(typeof(DerivedClass)) 
Các vấn đề liên quan