Câu trả lời:
Suy tư; Cho một ví dụ:
obj.GetType().GetProperties();
cho một loại:
typeof(Foo).GetProperties();
ví dụ:
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));
}
Theo dõi phản hồi ...
null
làm đối số đầu tiên choGetValue
GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
(trả về tất cả các thuộc tính công khai / riêng).internal
các thuộc tính. Có lẽ tôi là người duy nhất bị treo lên trên cú pháp private
/ non-public
?
using System.Reflection
và System.Reflection.TypeExtensions
gói được tham chiếu - điều này cung cấp bề mặt API bị thiếu thông qua các phương thức mở rộng
Bạn có thể sử dụng Reflection để làm điều này: (từ thư viện của tôi - cái này lấy tên và giá trị)
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;
}
Điều này sẽ không hoạt động đối với các thuộc tính có chỉ mục - vì điều đó (nó trở nên khó sử dụng):
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[]{});
}
Ngoài ra, để chỉ nhận các thuộc tính công khai: ( xem MSDN trên BindingFlags enum )
/* replace */
PropertyInfo[] props = t.GetProperties();
/* with */
PropertyInfo[] props = t.GetProperties(BindingFlags.Public)
Điều này cũng hoạt động trên các loại ẩn danh!
Để có được tên:
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();
}
Và nó chỉ giống nhau cho các giá trị hoặc bạn có thể sử dụng:
GetDictionaryFromType().Keys
// or
GetDictionaryFromType().Values
Nhưng đó là chậm hơn một chút, tôi sẽ tưởng tượng.
t.GetProperties(BindingFlags.Instance | BindingFlags.Public)
hoặct.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;
}
Hàm này dùng để lấy danh sách Thuộc tính lớp.
yield return
. Nó không phải là một vấn đề lớn, nhưng đó là một cách tốt hơn để làm điều đó.
Bạn có thể sử dụng System.Reflection
không gian tên với Type.GetProperties()
mehod:
PropertyInfo[] propertyInfos;
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public|BindingFlags.Static);
Đó là giải pháp của tôi
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;
}
}
}
Tôi cũng đang phải đối mặt với loại yêu cầu này.
Từ cuộc thảo luận này, tôi đã có một ý tưởng khác,
Obj.GetType().GetProperties()[0].Name
Điều này cũng hiển thị tên tài sản.
Obj.GetType().GetProperties().Count();
Điều này cho thấy số lượng tài sản.
Cảm ơn tất cả. Đây là cuộc thảo luận tốt đẹp.
Đây là câu trả lời @lucasjones được cải thiện. Tôi bao gồm những cải tiến được đề cập trong phần bình luận sau câu trả lời của anh ấy. Tôi hy vọng ai đó sẽ tìm thấy điều này hữu ích.
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();
}