2011-09-14 9 views
8

की बाधा का उल्लंघन करता है मैं इस पर थोड़ी देर के लिए अपने बालों को खींच रहा हूं, अनिवार्य रूप से मैं एक सामान्य भंडार कारखाना को लागू करने की कोशिश कर रहा हूं, जिसे निम्नानुसार कहा जाता है:जेनरिक और प्रतिबिंब - जेनेरिक आर्ग्यूमेंट्स [0]

public class RepositoryFactory<T> : IRepositoryFactory<T> 
{ 
    public T GetRepository(Guid listGuid, 
     IEnumerable<FieldToEntityPropertyMapper> fieldMappings) 
    { 
     Assembly callingAssembly = Assembly.GetExecutingAssembly(); 

     Type[] typesInThisAssembly = callingAssembly.GetTypes(); 

     Type genericBase = typeof (T).GetGenericTypeDefinition(); 

     Type tempType = (
      from type in typesInThisAssembly 
      from intface in type.GetInterfaces() 
      where intface.IsGenericType 
      where intface.GetGenericTypeDefinition() == genericBase 
      where type.GetConstructor(Type.EmptyTypes) != null 
      select type) 
      .FirstOrDefault(); 

     if (tempType != null) 
     { 
      Type newType = tempType.MakeGenericType(typeof(T)); 

      ConstructorInfo[] c = newType.GetConstructors(); 

      return (T)c[0].Invoke(new object[] { listGuid, fieldMappings }); 
     } 
    } 
} 

जब मैं GetRespository फोन करने की कोशिश में कार्य निम्न पंक्ति में विफल रहता है

Type newType = tempType.MakeGenericType(typeof(T)); 
:
var resposFactory = new RepositoryFactory<IRepository<Document>>(); 

भंडार कारखाने ऐसा दिखाई देता है

त्रुटि मैं मिलता है:

ArgumentException - GenericArguments [0], 'Framework.Repositories.IRepository`1 [Apps.Documents.Entities.PerpetualDocument]', 'Framework.Repositories.DocumentLibraryRepository`1 पर [टी] 'प्रकार' टी 'की बाधा का उल्लंघन करता है।

क्या गलत हो रहा है पर कोई विचार?

संपादित करें:

भंडार के कार्यान्वयन निम्नानुसार है:

public class DocumentLibraryRepository<T> : IRepository<T> 
               where T : class, new() 
{ 
    public DocumentLibraryRepository(Guid listGuid, IEnumerable<IFieldToEntityPropertyMapper> fieldMappings) 
    { 
     ... 
    } 

    ... 
} 

और तरह IRepository दिखता है:

public interface IRepository<T> where T : class 
    { 
     void Add(T entity); 
     void Remove(T entity); 
     void Update(T entity); 
     T FindById(int entityId); 
     IEnumerable<T> Find(string camlQuery); 
     IEnumerable<T> All(); 
    } 
+0

क्या आप वहां एक रिटर्न स्टेटमेंट खो रहे हैं? क्या आपने उस विधि की पूरी प्रतिलिपि बनाई है? –

+0

इसके अलावा, आप पैरामीटर रहित कन्स्ट्रक्टर की उपस्थिति की जांच क्यों कर रहे हैं जब आप स्पष्ट रूप से पैरामीटर के साथ एक कन्स्ट्रक्टर का आह्वान करना चाहते हैं? यदि आपके पास पैरामीटर रहित कन्स्ट्रक्टर है, तो यह संभवतः 'GetConstructors' द्वारा लौटाया गया 0 वां कन्स्ट्रक्टर होने वाला है, जिस स्थिति में * पैरामीटर के साथ * कॉलिंग विफल हो जाएगी। –

+0

हां क्षमा करें 'वापसी डिफ़ॉल्ट (टी)' अंत में होना चाहिए। – Bevan

उत्तर

6

आपका कोड के बजाय DocumentLibraryRepository<IRepository<Document>> का एक उदाहरण बनाने की कोशिश DocumentLibraryRepository<Document>

इसके बजाय आप इस कोड का उपयोग करना चाहते हैं:

var genericArgument = typeof(T).GetGenericArguments().FirstOrDefault(); 
if (tempType != null && genericArgument != null) 
{ 
    Type newType = tempType.MakeGenericType(genericArgument); 
+0

क्षमा करें हाँ मुझे यह जोड़ा जाना चाहिए था कि: सार्वजनिक इंटरफ़ेस आईआरपॉजिटरी जहां टी: कक्षा { शून्य जोड़ें (टी इकाई); शून्य निकालें (टी इकाई); शून्य अद्यतन (टी इकाई); टी FindById (int इकाई आईडी); आईनेमेरेबल खोजें (स्ट्रिंग camlQuery); आईनेमेरेबल सभी(); } – Bevan

+0

@ बेवन: ठीक है। कृपया मेरा अद्यतन उत्तर देखें। यह आपकी समस्या को ठीक करना चाहिए। –

+0

बहुत बहुत धन्यवाद, यह चाल है! आप एक जीवन बचतकर्ता हैं :) – Bevan

0

यह सुझाव है कि शायद आप सामान्य प्रकार DocumentLibraryRepository<T> पर एक where बाधा का उपयोग किया है और प्रकार PerpetualDocument कि बाधा

0

से मेल नहीं खाता है कि शायद मेरा जवाब किसी ऐसे व्यक्ति की मदद कर सकता है जिसमें एक ही त्रुटि हो। मेरे परिदृश्य है:

public class B 
{ 
    public string Name; 
} 

public class A 
{ 
    public EventHandler<B> TypedEvent; 

    public void MyMethod(B item) 
    { 
     if (TypedEvent != null) 
     { 
      TypedEvent(null, item); 
     } 
    } 
} 

public class T 
{ 
    public void Run() 
    { 
     A item = new A(); 
     item.TypedEvent += new EventHandler<B>(ItemEvent); 
    } 

    private void ItemEvent(object sender, B b) 
    { 
     b.Name = "Loaded"; 
    } 
} 
क्रम जब भागो() विधि भरी हुई है (निष्पादित नहीं) मैं एक अपवाद मिल पर

तो: GenericArguments [0] .... System.EventHandler`1 [TEventArgs] 'का उल्लंघन विधि पैरामीटर 'TeventArgs' की बाधा .. विधि रन() पर।

मुझे नहीं पता कि यह एक .NET बग है, लेकिन मेरे मामले में मैंने इस समस्या को टाइप किया है जिसमें टाइप किया गया हैसे EventHandler में टाइप किया गया। मेरे परिदृश्य बन:

public class B 
{ 
    public string Name; 
} 

public class A 
{ 
    public EventHandler TypedEvent; 

    public void MyMethod(B item) 
    { 
     if (TypedEvent != null) 
     { 
      TypedEvent(item, null); 
     } 
    } 
} 

public class T 
{ 
    public void Run() 
    { 
     A item = new A(); 
     item.TypedEvent += new EventHandler(ItemEvent); 
    } 

    private void ItemEvent(object sender, EventArgs e) 
    { 
     B b = sender as B; 
     b.Name = "Loaded"; 
    } 
} 

मुझे आशा है कि किसी की मदद कर सकते हैं।

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