2010-08-09 12 views
5

मैं एक फ़ाइल से कुछ डेटा रखने के लिए एक सरल सहायक वर्ग स्थापित कर रहा हूं जिसे मैं पार्स कर रहा हूं। गुणों के नाम उन मानों के नाम से मेल खाते हैं जिन्हें मैं फ़ाइल में ढूंढने की उम्मीद करता हूं। मैं अपनी कक्षा में AddPropertyValue नामक एक विधि जोड़ना चाहता हूं ताकि मैं किसी संपत्ति को स्पष्ट रूप से नाम से कॉल किए बिना किसी मूल्य को असाइन कर सकूं।क्या किसी संपत्ति के नाम को स्ट्रिंग के रूप में पास करना संभव है और इसके लिए कोई मान असाइन करना संभव है?

विधि इस प्रकार दिखाई देगा:

//C# 
public void AddPropertyValue(string propertyName, string propertyValue) { 
    //code to assign the property value based on propertyName 
} 

--- 

'VB.NET' 
Public Sub AddPropertyValue(ByVal propertyName As String, _ 
          ByVal propertyValue As String) 
    'code to assign the property value based on propertyName ' 
End Sub 

क्रियान्वयन ऐसा दिखाई दे सकता है:

सी #/VB.NET

MyHelperClass.AddPropertyValue("LocationID","5") 

प्रत्येक के लिए परीक्षण करने के लिए बिना यह संभव है आपूर्ति propertyName के खिलाफ व्यक्तिगत संपत्ति का नाम?

+0

बहुत इस पिछली पोस्ट के समान: http://stackoverflow.com/questions/110562/how-to-pass-a-generic-property-as-a- पैरामीटर-टू-ए-फ़ंक्शन – David

उत्तर

7

Type.GetProperty और फिर PropertyInfo.SetValue पर कॉल करके आप इसे प्रतिबिंब के साथ कर सकते हैं। वास्तव में मौजूद नहीं होने वाली संपत्ति की जांच करने के लिए आपको उचित त्रुटि प्रबंधन करने की आवश्यकता होगी।

using System; 
using System.Reflection; 

public class Test 
{ 
    public string Foo { get; set; } 
    public string Bar { get; set; } 

    public void AddPropertyValue(string name, string value) 
    { 
     PropertyInfo property = typeof(Test).GetProperty(name); 
     if (property == null) 
     { 
      throw new ArgumentException("No such property!"); 
     } 
     // More error checking here, around indexer parameters, property type, 
     // whether it's read-only etc 
     property.SetValue(this, value, null); 
    } 

    static void Main() 
    { 
     Test t = new Test(); 
     t.AddPropertyValue("Foo", "hello"); 
     t.AddPropertyValue("Bar", "world"); 

     Console.WriteLine("{0} {1}", t.Foo, t.Bar); 
    } 
} 

आप इस एक बहुत क्या करने की जरूरत है, यह प्रदर्शन के मामले में काफी दर्द हो सकता है:

यहां एक नमूना है। प्रतिनिधियों के आस-पास की चालें हैं जो इसे बहुत तेज बना सकती हैं, लेकिन यह पहले काम करने के लायक है।

4

प्रतिबिंब का उपयोग करके आप नाम का उपयोग कर संपत्ति हो और अपने मूल्य सेट ... कुछ की तरह:

Type t = this.GetType(); 
var prop = t.GetProperty(propName); 
prop.SetValue(this, value, null); 
2

कोड के आयोजन के संदर्भ में, आप इसे एक mixin-like तरह से कर सकता है (अलग से निपटने त्रुटि) :

public interface MPropertySettable { } 
public static class PropertySettable { 
    public static void SetValue<T>(this MPropertySettable self, string name, T value) { 
    self.GetType().GetProperty(name).SetValue(self, value, null); 
    } 
} 
public class Foo : MPropertySettable { 
    public string Bar { get; set; } 
    public int Baz { get; set; } 
} 

class Program { 
    static void Main() { 
    var foo = new Foo(); 
    foo.SetValue("Bar", "And the answer is"); 
    foo.SetValue("Baz", 42); 
    Console.WriteLine("{0} {1}", foo.Bar, foo.Baz); 
    } 
} 

इस तरह, आप कई अलग अलग वर्गों में उस तर्क का पुन: उपयोग कर सकते हैं, इसके साथ अपना कीमती एकल आधार वर्ग का त्याग किए बिना।

VB.NET में:

Public Interface MPropertySettable 
End Interface 
Public Module PropertySettable 
    <Extension()> _ 
    Public Sub SetValue(Of T)(ByVal self As MPropertySettable, ByVal name As String, ByVal value As T) 
    self.GetType().GetProperty(name).SetValue(self, value, Nothing) 
    End Sub 
End Module 
+1

और प्राप्त करने के लिए: सार्वजनिक स्थिर स्ट्रिंग GetValue (यह IPropertySettable self, string name) { स्वयं को वापस लौटें। गेट टाइप()। GetProperty (name) .GetValue (self, null)। ToString() ; } –

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

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