जवाबों:
प्रतिबिंब; एक उदाहरण के लिए:
obj.GetType().GetProperties();
एक प्रकार के लिए:
typeof(Foo).GetProperties();
उदाहरण के लिए:
class Foo {
public int A {get;set;}
public string B {get;set;}
}
...
Foo foo = new Foo {A = 1, B = "abc"};
foreach(var prop in foo.GetType().GetProperties()) {
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(foo, null));
}
प्रतिक्रिया के बाद ...
null
पहले तर्क के रूप में पास करेंGetValue
GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
(जो सभी सार्वजनिक / निजी उदाहरण गुण लौटाता है)।internal
गुण भी मिलते हैं । शायद मैं केवल एक ही हूं जो private
/ non-public
वाक्य रचना पर लटका हुआ है ?
using System.Reflection
के निर्देश और System.Reflection.TypeExtensions
इस विस्तार विधियों के माध्यम से याद आ रही एपीआई सतह प्रदान करता है - पैकेज संदर्भित
आप इसे करने के लिए प्रतिबिंब का उपयोग कर सकते हैं : (मेरी लाइब्रेरी से - यह नाम और मान प्राप्त करता है)
public static Dictionary<string, object> DictionaryFromType(object atype)
{
if (atype == null) return new Dictionary<string, object>();
Type t = atype.GetType();
PropertyInfo[] props = t.GetProperties();
Dictionary<string, object> dict = new Dictionary<string, object>();
foreach (PropertyInfo prp in props)
{
object value = prp.GetValue(atype, new object[]{});
dict.Add(prp.Name, value);
}
return dict;
}
यह चीज़ एक अनुक्रमणिका वाले गुणों के लिए काम नहीं करेगी - उसके लिए (यह अस्पष्ट है):
public static Dictionary<string, object> DictionaryFromType(object atype,
Dictionary<string, object[]> indexers)
{
/* replace GetValue() call above with: */
object value = prp.GetValue(atype, ((indexers.ContainsKey(prp.Name)?indexers[prp.Name]:new string[]{});
}
इसके अलावा, केवल सार्वजनिक संपत्ति पाने के लिए: ( बंधन पर MSDN देखें )
/* replace */
PropertyInfo[] props = t.GetProperties();
/* with */
PropertyInfo[] props = t.GetProperties(BindingFlags.Public)
यह अनाम प्रकारों पर भी काम करता है!
सिर्फ नाम पाने के लिए:
public static string[] PropertiesFromType(object atype)
{
if (atype == null) return new string[] {};
Type t = atype.GetType();
PropertyInfo[] props = t.GetProperties();
List<string> propNames = new List<string>();
foreach (PropertyInfo prp in props)
{
propNames.Add(prp.Name);
}
return propNames.ToArray();
}
और यह केवल मूल्यों के लिए उसी के बारे में है, या आप इसका उपयोग कर सकते हैं:
GetDictionaryFromType().Keys
// or
GetDictionaryFromType().Values
लेकिन यह थोड़ा धीमा है, मैं कल्पना करूंगा।
t.GetProperties(BindingFlags.Instance | BindingFlags.Public)
याt.GetProperties(BindingFlags.Static | BindingFlags.Public)
public List<string> GetPropertiesNameOfClass(object pObject)
{
List<string> propertyList = new List<string>();
if (pObject != null)
{
foreach (var prop in pObject.GetType().GetProperties())
{
propertyList.Add(prop.Name);
}
}
return propertyList;
}
यह फ़ंक्शन क्लास प्रॉपर्टीज़ की सूची प्राप्त करने के लिए है।
yield return
। यह कोई बड़ी बात नहीं है, लेकिन यह इसे करने का एक बेहतर तरीका है।
यही मेरा समाधान है
public class MyObject
{
public string value1 { get; set; }
public string value2 { get; set; }
public PropertyInfo[] GetProperties()
{
try
{
return this.GetType().GetProperties();
}
catch (Exception ex)
{
throw ex;
}
}
public PropertyInfo GetByParameterName(string ParameterName)
{
try
{
return this.GetType().GetProperties().FirstOrDefault(x => x.Name == ParameterName);
}
catch (Exception ex)
{
throw ex;
}
}
public static MyObject SetValue(MyObject obj, string parameterName,object parameterValue)
{
try
{
obj.GetType().GetProperties().FirstOrDefault(x => x.Name == parameterName).SetValue(obj, parameterValue);
return obj;
}
catch (Exception ex)
{
throw ex;
}
}
}
मैं भी इस तरह की आवश्यकता का सामना कर रहा हूं।
इस चर्चा से मुझे एक और आइडिया मिला,
Obj.GetType().GetProperties()[0].Name
यह संपत्ति का नाम भी दिखा रहा है।
Obj.GetType().GetProperties().Count();
इस गुण की संख्या दिखा रहा है।
सभी को धन्यवाद। यह अच्छी चर्चा है।
यहाँ @lucasjones उत्तर में सुधार किया गया है। मैंने उनके उत्तर के बाद टिप्पणी अनुभाग में उल्लिखित सुधारों को शामिल किया। मुझे आशा है कि किसी को यह उपयोगी लगेगा।
public static string[] GetTypePropertyNames(object classObject, BindingFlags bindingFlags)
{
if (classObject == null)
{
throw new ArgumentNullException(nameof(classObject));
}
var type = classObject.GetType();
var propertyInfos = type.GetProperties(bindingFlags);
return propertyInfos.Select(propertyInfo => propertyInfo.Name).ToArray();
}