2008-10-30 6 views
18

मेरे पास एक इंटरफ़ेस है जो विशेषताओं के साथ कुछ विधियों को परिभाषित करता है। इन विशेषताओं को कॉलिंग विधि से एक्सेस करने की आवश्यकता है, लेकिन मेरे पास विधि इंटरफ़ेस से गुण खींचती नहीं है। मैं क्या खो रहा हूँ?एक इंटरफेस पर गुण

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

बस एक चेक, आपने अपनी विशेषता पर उचित ध्वज सेट किया है ताकि इसे विरासत में प्राप्त किया जा सके? –

उत्तर

7

विधिबेस इंटरफ़ेस नहीं, कक्षा पर विधि होगी। आपको इंटरफेस पर एक ही विधि की तलाश करनी होगी। सी # में यह थोड़ा आसान है (क्योंकि यह नाम से होना चाहिए), लेकिन आपको स्पष्ट कार्यान्वयन जैसी चीजों पर विचार करना होगा। यदि आपके पास वीबी कोड है तो यह अधिक कठिन होगा, क्योंकि वीबी विधि "फू" एक इंटरफ़ेस विधि "बार" लागू कर सकती है। ऐसा करने के लिए, आप इंटरफ़ेस मानचित्र की जाँच करने की आवश्यकता होगी:

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

ऐसा लगता है कि जेनेरिक इंटरफेस के लिए काम नहीं करना है। IFoo Thad

+0

मुझे यह – Thad

+0

को संभालने का एक तरीका मिला है आपने मुझे एमएसडीएन पर लगभग 1/2 दिन स्पेलंकिंग बचाया है। धन्यवाद। – dviljoen

0

जब मैं पहली बार कबूल करेगा कि मैं इंटरफेस के लिए गुण संलग्न करने की कोशिश कभी नहीं की है, लेकिन क्या तुम निम्नलिखित काम की तरह कुछ?

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

मार्क की विधि गैर-सामान्य इंटरफेस के लिए काम करेगी। लेकिन ऐसा लगता है कि मैं कुछ है कि जेनरिक

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

ऐसा लगता है कि टी map.TargetMethods में वास्तविक classType साथ बदल दिया है के साथ काम कर रहा हूँ।

+1

क्या आप संदर्भ के बारे में अधिक जानकारी दे सकते हैं? मैं जो कुछ करने की कोशिश कर रहा हूं उसे मैं कल्पना नहीं कर सकता ... –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^