2011-01-04 33 views
8

Tôi có chung lớp sauĐúc một lớp chung không có loại cụ thể

public class Home<T> where T : Class 
{ 
    public string GetClassType 
    { 
     get{ return T.ToString() } 
    } 
} 

Bây giờ, tôi nhận được một đối tượng X mà tôi biết chắc chắn là Trang chủ:

public void DoSomething(object x) 
{ 
    if(x is // Check if Home<>) 
    { 
     // I want to invoke GetClassType method of x 
     // but I don't know his generic type 
     x as Home<?> // What should I use here? 
    } 
} 

Tôi có thể thậm chí tạo một diễn viên mà không chỉ định loại chung của lớp?

Trả lời

9

Nếu bạn chắc chắn đối số là DoSomething sẽ là Home<T>, tại sao bạn không sử dụng phương pháp chung?

public void DoSomething<T>(Home<T> home) 
{ 
    ... 
} 

Tất nhiên, nó sẽ dễ dàng hơn nếu DoSomething logic phải là một phương pháp dụ trên Home<T>.

Nếu bạn thực sự muốn gắn bó với những gì bạn có, bạn có thể sử dụng phản chiếu (chưa được kiểm tra):

public void DoSomething(object x) 
{ 
    // null checks here. 

    Type t = x.GetType(); 

    if (t.IsGenericType && 
      && t.GetGenericTypeDefinition() == typeof(Home<>)) 
    { 
     string result = (string) t.GetProperty("GetClassType") 
            .GetValue(x, null); 

     Console.WriteLine(result); 
    } 

    else 
    { 
     ... // do nothing/throw etc. 
    } 
} 
0

Bạn đã cố gắng thay đổi định nghĩa phương pháp của bạn để một cái gì đó như thế này?

public void DoSomething<T>(Home<T> x) 
{ 

} 
1

Làm thế nào để tạo chức năng chung?

public void DoSomething<T>(object x) 
{ 
    if(x is Home<T>) 
    { 
     x as Home<T> ... 
    } 
} 

Edit: possiblity khác sẽ được để tạo ra một giao diện nắm giữ tài sản GetClassName vì vậy bạn chỉ cần phải kiểm tra xem nó là của giao diện đó.

public interface IDescribeClass 
{ 
    public string GetClassName { get; set; } 
} 

BTW: Tôi sẽ sử dụng tên đầy đủ trình độ

public string ClassType 
{ 
    get{ return typeof(T).FullName; } 
} 
4

gì nếu chủ có nguồn gốc từ một lớp cơ sở?

public class Home 
{ 
    public virtual string GetClassType { get; } 
} 
public class Home<T> : Home 
    where T : class 
{ 
    public override string GetClassType 
    { 
     get{ return T.ToString() } 
    } 
    ... 
} 

và sau đó

public void DoSomething(object x) 
{ 
    if(x is Home) 
    { 
     string ct = ((Home)x).GetClassType; 
     ... 
    } 
} 
Các vấn đề liên quan