2010-03-22 9 views
17

मुझे वस्तुओं के समूह के डेटाटाइम को समायोजित करने की आवश्यकता है।मैं कक्षा में डेटटाइम के प्रकार के सभी गुण कैसे प्राप्त करूं?

मैं कक्षा के गुणों के माध्यम से लूप करना चाहता हूं और यदि प्रकार दिनांक है तो तदनुसार समायोजित करें।

क्या कोई भी प्रकार का 'वर्णन प्रकार' भलाई में बनाया गया है जिसका उपयोग मैं कर सकता हूं?

+0

किस तरह से समायोजित करें? –

+0

कई घंटे जोड़ें। – Chin

उत्तर

18

आप इस के लिए reflection उपयोग कर सकते हैं।

आपका परिदृश्य इस तरह कुछ हद तक दिख सकता है:

static void Main(string[] args) 
    { 
     var list = new List<Mammal>(); 

     list.Add(new Person { Name = "Filip", DOB = DateTime.Now }); 
     list.Add(new Person { Name = "Peter", DOB = DateTime.Now }); 
     list.Add(new Person { Name = "Goran", DOB = DateTime.Now }); 
     list.Add(new Person { Name = "Markus", DOB = DateTime.Now }); 

     list.Add(new Dog { Name = "Sparky", Breed = "Unknown" }); 
     list.Add(new Dog { Name = "Little Kid", Breed = "Unknown" }); 
     list.Add(new Dog { Name = "Zorro", Breed = "Unknown" }); 

     foreach (var item in list) 
      Console.WriteLine(item.Speek()); 

     list = ReCalculateDOB(list); 

     foreach (var item in list) 
      Console.WriteLine(item.Speek()); 
    } 

आप कहाँ चाहते हैं सभी स्तनधारियों की जन्मदिन फिर से गणना करने के लिए। और इसके बाद के संस्करण के क्रियान्वयन इस तरह देख रहे हैं:

internal interface Mammal 
{ 
    string Speek(); 
} 

internal class Person : Mammal 
{ 
    public string Name { get; set; } 
    public DateTime DOB { get; set; } 

    public string Speek() 
    { 
     return "My DOB is: " + DOB.ToString() ; 
    } 
} 
internal class Dog : Mammal 
{ 
    public string Name { get; set; } 
    public string Breed { get; set; } 

    public string Speek() 
    { 
     return "Woff!"; 
    } 
} 

तो बुनियादी तौर पर आप क्या करने की जरूरत Relfection, जो प्रकार की जाँच करें और है कि रन समय में की तरह प्रकार के गुण और अन्य चीजें पाने के लिए एक mechanizm है उपयोग करने के लिए है । यहां एक उदाहरण दिया गया है कि आप डीओबी प्राप्त करने वाले प्रत्येक स्तनधारी के लिए उपर्युक्त डीओबी में 10 दिन कैसे जोड़ते हैं।

static List<Mammal> ReCalculateDOB(List<Mammal> list) 
{ 
    foreach (var item in list) 
    { 
     var properties = item.GetType().GetProperties(); 
     foreach (var property in properties) 
     { 
      if (property.PropertyType == typeof(DateTime)) 
       property.SetValue(item, ((DateTime)property.GetValue(item, null)).AddDays(10), null); 
     } 
    } 

    return list; 
} 

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

My DOB is: 2010-03-22 09:18:12 
My DOB is: 2010-03-22 09:18:12 
My DOB is: 2010-03-22 09:18:12 
My DOB is: 2010-03-22 09:18:12 
Woff! 
Woff! 
Woff! 
My DOB is: 2010-04-01 09:18:12 
My DOB is: 2010-04-01 09:18:12 
My DOB is: 2010-04-01 09:18:12 
My DOB is: 2010-04-01 09:18:12 
Woff! 
Woff! 
Woff! 
+0

वाह, पहले से ही एक उत्तर सही के रूप में चिह्नित किया गया है। लेकिन आपकी मदद ने दिन बचा लिया है - चीयर्स – Chin

+0

किसी ऑब्जेक्ट का उपयोग करने के लिए आप इसे कैसे संशोधित करेंगे –

1

प्रतिबिंब ऊपर लग रही है लेकिन मूल रूप से आप इस

obj.GetType() GetProperties करते हैं। (.. उदाहरण | ..Public) और आप गुण परिभाषित की एक सूची मिल गया .. संपत्ति के मूल्य प्रकार की जांच और इसे टाइपऑफ (डेटटाइम) से तुलना करें।

11

इसे प्रतिबिंब कहा जाता है।

var t = this; 
var props = t.GetType().GetProperties(); 
foreach (var prop in props) 
{ 
    if (prop.PropertyType == typeof(DateTime)) 
    { 
     //do stuff like prop.SetValue(t, DateTime.Now, null); 

    } 
} 
+0

बहुत सराहना की। प्रतिबिंब में देखेंगे। – Chin

3
class HasDateTimes 
{ 
    public DateTime Foo { get; set; } 
    public string NotWanted { get; set; } 
    public DateTime Bar { get { return DateTime.MinValue; } } 
} 

static void Main(string[] args) 
{ 
    foreach (var propertyInfo in 
    from p in typeof(HasDateTimes).GetProperties() 
     where Equals(p.PropertyType, typeof(DateTime)) select p) 
    { 
    Console.WriteLine(propertyInfo.Name); 
    } 
} 
+1

linq समाधान – Axarydax

+0

के लिए +1 ओह मैंने इस समय LINQ के बारे में नहीं सोचा था :) –

0

, और यदि आप PowerShell उपलब्ध (विस्टा/विंडोज 7, विंडोज 2008 पहले से ही मिल गया यह स्थापित) आप कर सकते हैं:

हालांकि, ऊपर इस प्रिंट होगा बस कंसोल को फायर करें और डेटटाइम उदाहरण के लिए

Get-Date | Get-Member 

जो आपको डेटटाइम उदाहरण के सदस्यों की सूची देगा। आप स्थिर सदस्यों देख सकते हैं:

Get-Date | Get-Member -Static 
0

क्या आप Fasterflect में रुचि हो सकती प्रतिबिंब के प्रदर्शन प्रभाव के बारे में चिंतित हैं, एक पुस्तकालय लगाने और उन्हें पहुँचने के सदस्यों को आसान और तेज बनाने के लिए।

var query = from property in typeof(HasDateTimes).Properties() 
      where property.Type() == typeof(DateTime) 
      select p; 
Array.ForEach(query.ToArray(), p => Console.WriteLine(p.Name)); 

Fasterflect हल्के वजन कोड पीढ़ी का उपयोग करता है तेजी से (2-5 बार का एक पहलू से, या लगभग देशी साथ पहुँचता बनाने के लिए:

instace के लिए, MaxGuernseyIII के कोड इस तरह Fasterflect का उपयोग कर फिर से लिखा जा सकता है अगर आप सीधे जेनरेट किए गए प्रतिनिधियों को कैश करते हैं और आह्वान करते हैं तो गति)। सदस्यों के लिए पूछताछ आम तौर पर आसान और अधिक सुविधाजनक है लेकिन कोई तेज़ नहीं है। ध्यान दें कि इन संख्याओं में जेआईटी-जेनरेट किए गए कोड को संकलित करने के महत्वपूर्ण प्रारंभिक ओवरहेड शामिल नहीं हैं, इसलिए प्रदर्शन लाभ केवल बार-बार पहुंच के लिए दृश्यमान हो जाते हैं।

अस्वीकरण: मैं इस परियोजना में योगदानकर्ता हूं।

0

अरे इस सवाल का एक छोटा सा पुराना है, लेकिन आप इस इस्तेमाल कर सकते हैं: वर्ग के भीतर

(सभी मानों को चुन) - बस के चयन के लिए मूल्य निर्धारित डाली यह `s के बिना चला जाएगा:

(from property in this.GetType().GetProperties() 
        where property.PropertyType == typeof(DateTime) 
        select property.GetValue(this)).Cast<DateTime>() 

वर्ग के बाहर होगा:

var instance = new MyClass(); 
var times = (from property in instance.GetType().GetProperties() 
         where property.PropertyType == typeof(DateTime) 
         select property.GetValue(instance)).Cast<DateTime>() 

अधिकतम Datetime मूल्य मिल रहा है के लिए मैं इस

चलाने
var lastChange = (from property in this.GetType().GetProperties() 
         where property.PropertyType == typeof(DateTime) 
         select property.GetValue(this)).Cast<DateTime>().Max(); 
संबंधित मुद्दे

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