2010-06-23 24 views
6
using System; 

interface IAnimal 
{ 
} 

class Cat: IAnimal 
{ 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     IAnimal cat = new Cat(); 

     // Console.WriteLine(cat.GetType()); 
      // This would only give me the type of 
      // the backing store, i.e. Cat. Is there a 
      // way I can get to know that the identifier 
      // cat was declared as IAnimal? 

     Console.ReadKey(); 
    } 
} 

Cập nhật: Nhờ Dan Bryant cho lời nhắc nhở.Phân biệt giữa các loại dùng để tham chiếu một đối tượng và các loại hình cửa hàng ủng hộ mình

using System; 
using System.Reflection; 
using System.Collections.Generic; 
using System.Linq; 

namespace TypeInfo 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
      IAnimal myCat = new Cat(); 
      ReflectOnType(); 
      Console.ReadKey(); 
     } 

     public static void ReflectOnType() 
     { 
      Assembly.GetExecutingAssembly(). 
       GetType("TypeInfo.Program"). 
       GetMethod("Main", 
       BindingFlags.Static| BindingFlags.Public). 
       GetMethodBody().LocalVariables. 
       ToList(). 
       ForEach(l => Console.WriteLine(l.LocalType)); 
     } 
    } 

    interface IAnimal { } 
    class Cat : IAnimal { } 
} 
+1

Có thể, nhưng bạn phải suy nghĩ về phương pháp riêng của mình; LocalVariableInfo có một LocalType bạn có thể sử dụng. Xem tại đây: http://stackoverflow.com/questions/2696691/can-i-get-the-method-local-variables-through-a-stack-trace-in-c –

+1

Tại sao bạn muốn làm điều này khi loại có sẵn tĩnh? –

+0

@Dan Bryant: Chết tiệt! Chỉ trích! Chỉ trích! Tôi sử dụng LocalVariableInfo và LocalType mọi lúc. Tôi lam sao vậy nhỉ? Và tôi đã sử dụng nó trong một kịch bản tương tự trước đó. Chỉ trích! Tại sao tôi hỏi câu hỏi này? Cảm ơn một triệu lời nhắc nhở. –

Trả lời

0

Mỗi đề xuất ở trên, tôi đăng đây là câu trả lời. Xem các ý kiến ​​ở trên để biết thêm ngữ cảnh.


Bạn đã chỉ ra rằng bạn vẫn thấy 'cửa hàng sao lưu' với LocalVariableInfo. Điều này gợi ý cho tôi là tuyên bố hoàn toàn là nguồn gốc và không thực sự được mã hóa trong phương pháp này. Thực tế là bạn đã chọn sử dụng một giao diện như kiểu 'được khai báo' là không thích hợp, vì trình biên dịch đã chọn sử dụng loại cụ thể hơn cho vùng biến cục bộ. Hãy thử chạy ILdasm trên đầu ra DLL của bạn và bạn có thể xem nếu điều này là đúng sự thật. Nếu có, lựa chọn duy nhất của bạn là xem xét mã nguồn, vì thông tin theo nghĩa đen không tồn tại trong phiên bản đã biên dịch.

+0

Tôi đã sửa. Tôi đã không. Trong khi tôi đã viết mã để sử dụng LocalVariableInfo.LocalType, tôi đã, err, thậm chí không gọi mã. Mã gọi của tôi vẫn có Console.WriteLine (obj.GetType()). –

1

Bạn có thể sử dụng chung suy luận kiểu:

using System; 

internal interface IAnimal 
{ 
} 

internal class Cat : IAnimal 
{ 
} 

class Program 
{ 
    static void Main() 
    { 
     var cat = new Cat(); 
     Console.WriteLine(cat.GetType()); // Cat 
     Console.WriteLine(GetStaticType(cat)); // Cat 

     IAnimal animal = cat; 
     Console.WriteLine(GetStaticType(animal)); // IAnimal 
    } 

    static Type GetStaticType<T>(T _) 
    { 
     return typeof (T); 
    } 
} 
Các vấn đề liên quan