2013-04-10 4 views
18

कहना है कि मैं एक वर्ग, फू, कुछ इस तरह लग रही है:'System.Collections.Generic.IList <object>' 'जोड़ें' के लिए एक परिभाषा शामिल नहीं है 'गतिशील' और 'ExpandoObject'

public class Foo : IFoo 
{ 
    public Foo() 
    { 
     Bars = new List<dynamic>(); 
    } 
    public IList<dynamic> Bars { get; set; } 
} 

public interface IFoo 
{ 
    IList<dynamic> Bars { get; set; } 
} 

अब, जब मैं निम्न करें::

IFoo foo = new Foo(); 
dynamic a = new System.Dynamic.ExpandoObject(); 
a.Prop = 10000; 
dynamic b = new System.Dynamic.ExpandoObject(); 
b.Prop = "Some Text"; 
foo.Bars.Add(a); // Throws an 'System.Collections.Generic.IList<object>' does not contain a definition for 'Add' - exception!!!!! 
foo.Bars.Add(b); // Same here!!!!! 

मैं क्या कर रहा हूँ

इंटरफ़ेस IFoo तरह लग रहा है यहाँ गलत कर रहा है ?????

+1

संभव डुप्लिकेट (http://stackoverflow.com/questions/7996491/cant-understand-the-exception-when- उपयोग-गतिशील-जेनेरिक-संग्रह-इन-ने) –

+0

क्या आप जो अपवाद प्राप्त कर रहे हैं उसे पोस्ट करेंगे? –

उत्तर

21

यह ज्ञात गतिशील बाध्यकारी issue है।

यहां कुछ काम आसपास हैं।

उपयोग ICollection<dynamic> बजाय:

void Main() 
{ 
    IFoo foo = new Foo(); 
    dynamic a = new System.Dynamic.ExpandoObject(); 
    a.Prop = 10000; 
    dynamic b = new System.Dynamic.ExpandoObject(); 
    b.Prop = "Some Text"; 
    foo.Bars.Add(a); 
    foo.Bars.Add(b); 
} 

public interface IFoo 
{ 
    ICollection<dynamic> Bars { get; set; } 
} 

public class Foo : IFoo 
{ 
    public Foo() 
    { 
     Bars = new List<dynamic>(); 
    } 

    public ICollection<dynamic> Bars { get; set; } 
} 

या सीधे ऊपर List<dynamic>:

public interface IFoo 
{ 
    List<dynamic> Bars { get; set; } 
} 

public class Foo : IFoo 
{ 
    public Foo() 
    { 
     Bars = new List<dynamic>(); 
    } 

    public List<dynamic> Bars { get; set; } 
} 

या dynamic foo का उपयोग करें:

void Main() 
{ 
    dynamic foo = new Foo(); 
    dynamic a = new System.Dynamic.ExpandoObject(); 
    a.Prop = 10000; 
    dynamic b = new System.Dynamic.ExpandoObject(); 
    b.Prop = "Some Text"; 
    foo.Bars.Add(a); 
    foo.Bars.Add(b); 
} 

या, नहीं गतिशील बाँध add कर object कास्ट कर:

void Main() 
{ 
    IFoo foo = new Foo(); 
    dynamic a = new System.Dynamic.ExpandoObject(); 
    a.Prop = 10000; 
    dynamic b = new System.Dynamic.ExpandoObject(); 
    b.Prop = "Some Text"; 
    foo.Bars.Add((object)a); 
    foo.Bars.Add((object)b); 
} 

या ActLike & Prototype Builder Syntax (nuget में) के साथ मेरी अचानक इंटरफ़ेस की तरह एक तीसरी पार्टी के ढांचे का उपयोग कर अधिक अर्थपूर्ण हो।

void Main() 
{ 
    dynamic New = Builder.New<ExpandoObject>(); 

    IFoo foo = Impromptu.ActLike(
        New.Foo(
         Bars: New.List(
           New.Obj(Prop:10000), 
           New.Obj(Prop:"Some Text") 
          ) 
         ) 
        ); 
} 

public interface IFoo 
{ 
    IList<dynamic> Bars { get; set; } 
} 
की [अपवाद नहीं समझा जा सकता जब .net4 में जेनेरिक संग्रह के साथ गतिशील का उपयोग कर]
+0

आपको बहुत बहुत धन्यवाद - यह मुझे सही दिशा में इंगित करता है :) – user1297653

+0

बहुत बहुत धन्यवाद! मैं इसे खोने वाला था। – rpattabi

2

मैं अगर यह बाधित अपने विशेष उपयोग के मामले में निश्चित नहीं हूँ, लेकिन:

स्पष्ट System.Collections.IList को Bars कास्टिंग की कोशिश करो।

((System.Collections.IList)foo.Bars).Add(a); 

स्रोत: https://stackoverflow.com/a/9468123/364

वैकल्पिक रूप से, सिर्फ Bars अपने इंटरफेस + कक्षा में IList बजाय IList<dynamic> के रूप में फिर से परिभाषित।

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