수업이 있습니다.
Public Class Foo
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private _Age As String
Public Property Age() As String
Get
Return _Age
End Get
Set(ByVal value As String)
_Age = value
End Set
End Property
Private _ContactNumber As String
Public Property ContactNumber() As String
Get
Return _ContactNumber
End Get
Set(ByVal value As String)
_ContactNumber = value
End Set
End Property
End Class
위 클래스의 속성을 반복하고 싶습니다. 예를 들어;
Public Sub DisplayAll(ByVal Someobject As Foo)
For Each _Property As something In Someobject.Properties
Console.WriteLine(_Property.Name & "=" & _Property.value)
Next
End Sub
답변
반사 사용 :
Type type = obj.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
Console.WriteLine("Name: " + property.Name + ", Value: " + property.GetValue(obj, null));
}
Excel의 경우-목록에 “System.Reflection”항목이 없으므로 BindingFlags에 액세스하기 위해 추가해야하는 도구 / 참조 항목
편집 : BindingFlags 값을 type.GetProperties()
다음과 같이 지정할 수도 있습니다 .
BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
PropertyInfo[] properties = type.GetProperties(flags);
반환 된 속성을 퍼블릭 인스턴스 속성 (정적 속성, 보호 속성 등 제외)으로 제한합니다.
를 지정할 필요는 없습니다 . 속성 값을 얻기 위해 BindingFlags.GetProperty
호출 type.InvokeMember()
할 때 사용합니다 .
답변
당신이 말하고있는 객체가 커스텀 프로퍼티 모델 (예 : DataRowView
for 등)을 가지고 있다면, 당신은 DataTable
사용해야합니다 TypeDescriptor
. 좋은 소식은 여전히 정규 수업에서 잘 작동한다는 것입니다 (반사보다 훨씬 빠를 수도 있습니다 ).
foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) {
Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(obj));
}
또한 TypeConverter
서식 과 같은 것에 쉽게 액세스 할 수 있습니다 .
string fmt = prop.Converter.ConvertToString(prop.GetValue(obj));
답변
Brannon이 제공 한 C #의 VB 버전 :
Public Sub DisplayAll(ByVal Someobject As Foo)
Dim _type As Type = Someobject.GetType()
Dim properties() As PropertyInfo = _type.GetProperties() 'line 3
For Each _property As PropertyInfo In properties
Console.WriteLine("Name: " + _property.Name + ", Value: " + _property.GetValue(Someobject, Nothing))
Next
End Sub
3 번 줄 대신에 바인딩 플래그 사용하기
Dim flags As BindingFlags = BindingFlags.Public Or BindingFlags.Instance
Dim properties() As PropertyInfo = _type.GetProperties(flags)
답변
반사는 꽤 “무거운”
아마도이 솔루션을 사용해보십시오 : // C #
if (item is IEnumerable) {
foreach (object o in item as IEnumerable) {
//do function
}
} else {
foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties()) {
if (p.CanRead) {
Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, null)); //possible function
}
}
}
‘VB.Net
If TypeOf item Is IEnumerable Then
For Each o As Object In TryCast(item, IEnumerable)
'Do Function
Next
Else
For Each p As System.Reflection.PropertyInfo In obj.GetType().GetProperties()
If p.CanRead Then
Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, Nothing)) 'possible function
End If
Next
End If
리플렉션 속도 가 매일의 성능에 표시되는 방법 호출 속도의 +/- 1000 x 느려짐
답변
LINQ 람다를 사용하는 다른 방법이 있습니다.
씨#:
SomeObject.GetType().GetProperties().ToList().ForEach(x => Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, null)}"));
VB.NET :
SomeObject.GetType.GetProperties.ToList.ForEach(Sub(x) Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, Nothing)}"))
답변
이것이 내가하는 방법입니다.
foreach (var fi in typeof(CustomRoles).GetFields())
{
var propertyName = fi.Name;
}
답변
private void ResetAllProperties()
{
Type type = this.GetType();
PropertyInfo[] properties = (from c in type.GetProperties()
where c.Name.StartsWith("Doc")
select c).ToArray();
foreach (PropertyInfo item in properties)
{
if (item.PropertyType.FullName == "System.String")
item.SetValue(this, "", null);
}
}
위의 코드 블록을 사용하여 이름이 “Doc”으로 시작되는 웹 사용자 정의 컨트롤 개체의 모든 문자열 속성을 재설정했습니다.