Có thể phản ánh về việc triển khai giao diện rõ ràng từ ngăn xếp cuộc gọi không? Tôi muốn sử dụng thông tin này để tra cứu một thuộc tính trên chính giao diện.Làm thế nào để phản ánh trên C# thực hiện giao diện rõ ràng từ ngăn xếp cuộc gọi?
Với mã này:
interface IFoo
{
void Test();
}
class Foo : IFoo
{
void IFoo.Test() { Program.Trace(); }
}
class Program
{
static void Main(string[] args)
{
IFoo f = new Foo();
f.Test();
}
public static void Trace()
{
var method = new StackTrace(1, false).GetFrame(0).GetMethod();
// method.???
}
}
Cụ thể, trong Trace(), tôi muốn để có thể có được để typeof(IFoo)
từ method
.
Trong cửa sổ xem, nếu tôi nhìn vào method.ToString()
, nó cung cấp cho tôi Void InterfaceReflection.IFoo.Test()
(InterfaceReflection là tên của hội đồng của tôi).
Làm cách nào để truy cập vào số typeof(IFoo)
từ đó? Tôi có phải sử dụng tra cứu kiểu dựa trên tên từ bản thân hội đồng hoặc có một số Type IFoo
ẩn ở đâu đó trong số MethodBase
không?
UPDATE:
Dưới đây là giải pháp cuối cùng, nhờ vào Kyte
public static void Trace()
{
var method = new StackTrace(1, false).GetFrame(0).GetMethod();
var parts = method.Name.Split('.');
var iname = parts[parts.Length - 2];
var itype = method.DeclaringType.GetInterface(iname);
}
itype
sẽ có các loại giao diện cho phương pháp thực hiện. Điều này sẽ chỉ làm việc với việc triển khai giao diện rõ ràng, nhưng đó chính xác là những gì tôi cần. Bây giờ tôi có thể sử dụng itype
để truy vấn các thuộc tính gắn liền với loại giao diện thực tế.
Nhờ mọi người giúp đỡ.
Ah! Đó là nó, cảm ơn bạn. Tôi chỉ nhìn vào các thuộc tính, và không nghĩ xem xét các phương pháp. Tôi nghĩ 'GetInterfaces()' là những gì tôi có thể sử dụng. Tôi sẽ sử dụng 'method.Name' cho tôi' InterfaceReflection.IFoo.Test', tôi sẽ kéo ra "IFoo" và sử dụng 'GetInterface()' để tìm kiểu kết hợp của nó. Điều đó hoạt động. – scobi
Nếu Foo triển khai hơn 1 giao diện, thì bạn vẫn sẽ phải tìm ra phương thức nào thuộc về ... Cộng với những gì nếu Kiểm tra không được xác định trong Giao diện và là phương pháp thực tế của Foo? – CodingWithSpike
@ rally25rs: Bạn có thể chạy i.GetMethods() và khớp với kết quả của GetFrame (0) .GetMethod() – Kyte