2008-10-30 40 views
18

Tôi có một giao diện xác định một số phương pháp có thuộc tính. Các thuộc tính này cần phải được truy cập từ phương thức gọi, nhưng phương thức mà tôi có không kéo các thuộc tính từ giao diện. Tôi đang thiếu gì?Thuộc tính trên giao diện

public class SomeClass: ISomeInterface 
{ 
    MyAttribute GetAttribute() 
    { 
     StackTrace stackTrace = new StackTrace(); 
     StackFrame stackFrame = stackTrace.GetFrame(1); 
     MethodBase methodBase = stackFrame.GetMethod(); 
     object[] attributes = methodBase.GetCustomAttributes(typeof(MyAttribute), true); 
     if (attributes.Count() == 0) 
      throw new Exception("could not find MyAttribute defined for " + methodBase.Name); 
     return attributes[0] as MyAttribute; 
    } 

    void DoSomething() 
    { 
     MyAttribute ma = GetAttribute(); 
     string s = ma.SomeProperty; 
    } 
} 
+1

Chỉ cần kiểm tra, bạn đã đặt cờ thích hợp trên thuộc tính của mình để cho phép nó được kế thừa phải không? –

Trả lời

7

Phương thứcBase sẽ là phương thức trên lớp chứ không phải giao diện. Bạn sẽ cần phải tìm phương pháp tương tự trên giao diện. Trong C#, điều này đơn giản hơn một chút (vì nó phải giống như tên), nhưng bạn sẽ cần phải xem xét những thứ như thực hiện rõ ràng. Nếu bạn có mã VB nó sẽ phức tạp hơn, vì phương thức VB "Foo" có thể thực hiện một phương thức giao diện "Bar". Để thực hiện việc này, bạn cần phải điều tra bản đồ giao diện:

using System; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Reflection; 
interface IFoo 
{ 
    void AAA(); // just to push Bar to index 1 
    [Description("abc")] 
    void Bar(); 
} 
class Foo : IFoo 
{ 
    public void AAA() { } // just to satisfy interface 
    static void Main() 
    { 
     IFoo foo = new Foo(); 
     foo.Bar(); 
    } 
    void IFoo.Bar() 
    { 
     GetAttribute(); 
    } 

    void GetAttribute() 
    { // simplified just to obtain the [Description] 

     StackTrace stackTrace = new StackTrace(); 
     StackFrame stackFrame = stackTrace.GetFrame(1); 
     MethodBase classMethod = stackFrame.GetMethod(); 
     InterfaceMapping map = GetType().GetInterfaceMap(typeof(IFoo)); 
     int index = Array.IndexOf(map.TargetMethods, classMethod); 
     MethodBase iMethod = map.InterfaceMethods[index]; 
     string desc = ((DescriptionAttribute)Attribute.GetCustomAttribute(iMethod, typeof(DescriptionAttribute))).Description; 
    } 
} 
+0

Điều này có vẻ không hoạt động đối với Giao diện Chung. IFoo Thad

+0

Tôi tìm thấy một cách để xử lý này – Thad

+0

Bạn vừa lưu tôi về 1/2 ngày spelunking trên MSDN. Cảm ơn bạn. – dviljoen

0

Mặc dù trước tiên tôi sẽ thú nhận rằng tôi chưa bao giờ đính kèm thuộc tính vào Giao diện nhưng có điều gì giống như công việc sau đây cho bạn?

public abstract class SomeBaseClass: ISomeInterface 
{ 
    [MyAttribute] 
    abstract void MyTestMethod(); 


} 

public SomeClass : SomeBaseClass{ 

    MyAttribute GetAttribute(){ 
     Type t = GetType(); 
     object[] attibutes = t.GetCustomAttributes(typeof(MyAttribute), false); 

     if (attributes.Count() == 0) 
      throw new Exception("could not find MyAttribute defined for " + methodBase.Name); 
     return attributes[0] as MyAttribute; 
    } 


    .... 
} 
2

Phương pháp của Mark sẽ hoạt động cho các giao diện không chung chung. Nhưng có vẻ như tôi đang đối phó với một số người có generics

interface IFoo<T> {} 
class Foo<T>: IFoo<T> 
{ 
    T Bar() 
} 

Có vẻ như T được thay thế bằng classType thực tế trong map.TargetMethods.

+1

Bạn có thể cung cấp thêm thông tin về ngữ cảnh không? Tôi không thể hình dung được những gì bạn đang cố gắng làm ... –

Các vấn đề liên quan