2010-09-18 4 views
80

सी # में 3.0 आप निम्न सिंटैक्सगतिशील नई बेनामी कक्षा कैसे करें?

var o1 = new { Id = 1, Name = "Foo" }; 

साथ गुमनाम वर्ग बना सकते हैं वहाँ एक रास्ता गतिशील एक चर करने के लिए इन गुमनाम वर्ग बनाने के लिए है?


उदाहरण:

var o1 = new { Id = 1, Name = "Foo" }; 
var o2 = new { SQ = 2, Birth = DateTime.Now }; 

गतिशील उदाहरण बनाने के लिए:

var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo")); 
var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth", 
DateTime.Now)); 

क्योंकि मैं क्या करने की जरूरत:

dynamic o1 = new ExpandObject(); 
o1."ID" = 1; <--"ID" is dynamic name 
o1."Name" = "Foo"; <--"Name" is dynamic name 

और Scene1:

void ShowPropertiesValue(object o) 
{ 
    Type oType = o.GetType(); 
    foreach(var pi in oType.GetProperties()) 
    { 
    Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null)); 
    } 
} 

अगर मैं फोन:

dynamic o1 = new ExpandObject(); 
o1.Name = "123"; 
ShowPropertiesValue(o1); 

यह परिणाम नहीं दिखा सकते हैं:

Name = 123 

और यह भी मैं कैसे AnonymouseType को ExpandoObject कन्वर्ट करने के लिए?

Type type = o1.GetType(); 
type.GetProperties(); <--I hope it can get all property of o1 

अंतिम, मैं ShowPropertiesValue() विधि) को संशोधित

void ShowPropertiesValue(object o) 
{ 
    if(o is static object) <--How to check it is dynamic or static object? 
    { 
    Type oType = o.GetType(); 
    foreach(var pi in oType.GetProperties()) 
    { 
     Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null)); 
    } 
    } 
    else if(o is dynamic object) <--How to check it is dynamic or static object? 
    { 
    foreach(var pi in ???) <--How to get common dynamic object's properties info ? 
    { 
     Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null)); 
    } 
    } 
} 

कैसे DynamicNewAnonymous विधि लागू करने के लिए या कैसे ShowPropertiesValue बदलना चाहते हैं (?

मेरे मंशा है:

dynamic o1 = new MyDynamic(); 
o1.Name = "abc"; 
Type o1Type = o1.GetType(); 
var props = o1Type.GetProperties(); <--I hope can get the Name Property 

मैं dynamicObject के GetType विधि हुक कर सकते हैं और मजबूर दृढ़ता से टाइप करने के लिए प्रकार परिवर्तित करें। उपरोक्त सीमलेस कोड ठीक काम कर सकता है।

+0

@Vlad: मैं मानता हूं कि मैं प्रेरणा के बारे में थोड़ा अस्पष्ट हूं। –

+0

@VladLazarenko मुझे लगता है कि आप सही हैं :-) – oberfreak

+0

कृपया हमें बताएं, आप क्या करना चाहते हैं और यह आपका चयनित समाधान क्यों है। – oberfreak

उत्तर

61

बेनामी प्रकार केवल नियमित प्रकार हैं जिन्हें पूरी तरह से घोषित किया जाता है। उन्हें dynamic के साथ बहुत कम करना है।

अब, यदि आप ExpandoObject का उपयोग करना चाहते हैं और इसे dynamic चर के माध्यम से संदर्भित करते हैं, तो आप फ्लाई पर फ़ील्ड जोड़ या निकाल सकते हैं।

संपादित

सुनिश्चित करें कि आप कर सकते हैं: बस इसे IDictionary<string, object> लिए डाली। फिर आप इंडेक्सर का उपयोग कर सकते हैं।

आप क्षेत्रों पर पुनरावृति करने के लिए एक ही कास्टिंग तकनीक का उपयोग करें:

dynamic employee = new ExpandoObject(); 
employee.Name = "John Smith"; 
employee.Age = 33; 

foreach (var property in (IDictionary<string, object>)employee) 
{ 
    Console.WriteLine(property.Key + ": " + property.Value); 
} 
// This code example produces the following output: 
// Name: John Smith 
// Age: 33 

ऊपर कोड और अधिक है कि लिंक पर क्लिक करके पाया जा सकता है।

+1

लेकिन ExpandoObject इसे नहीं कर सकता: 'गतिशील o1 = नया ExpandObject(); ओ 1। "आईडी" = 1; ओ 1। "नाम" = "फू"; ' – Flash

+0

लेकिन यह भी नहीं कर सकता: टाइप करें o1 टाइप = o1.GetType(); var props = o1 टाइप। गेटप्रॉपर्टीज(); प्रोप खाली है – Flash

+1

आप जो भी कर रहे हैं वह कह रहा है कि गतिशील गुण दृढ़ता से टाइप किए गए गुणों के समान नहीं हैं। यह मामूली सच है। –

5

आप इस तरह की एक ExpandoObject बना सकते हैं:

IDictionary<string,object> expando = new ExpandoObject(); 
expando["Name"] = value; 

और गतिशील करने के लिए इसे डालने के बाद, उन मूल्यों गुण तरह दिखेगा:

dynamic d = expando; 
Console.WriteLine(d.Name); 

हालांकि, वे वास्तविक गुण नहीं हैं और नहीं किया जा सकता प्रतिबिंब का उपयोग कर पहुंचा। तो निम्नलिखित कथन एक शून्य वापस कर देगा:

d.GetType().GetProperty("Name")