확실한 수준으로 유형을 식별 할 수있는 방법을 찾고있는 것 같습니다. 한 가지 방법은 리플렉션을 사용하여 찾기 쉽고 필터링 할 수있는 맞춤 속성을 사용하는 것입니다. 속성을 반복 할 때 볼 수있는 RealMcCoy
경우가로 드릴 필요가 원하는/한 경우
Public Class RealMcCoy
Inherits Attribute
Public Property IsReal As Boolean
Public Sub New(b as Boolean)
IsReal = b
End Sub
End Class
<RealMcCoy(True)>
Public Class Patient
...
End Class
<RealMcCoy(True)>
Public Class Appointment
...
End Class
지금 확인합니다. 속성은 유형에있을 것입니다 때문에, 거기에 추가 단계는 각 속성의 유형을 얻을 당신이 유형을 추가하고 속성을 추가 해달라고하면 그것은 나누기
Dim props As PropertyInfo() = myFoo.GetType.GetProperties
Dim pt As Type
For Each pi As PropertyInfo In props
pt = pi.PropertyType ' get the property type
Dim attr() As RealMcCoy =
DirectCast(pt.GetCustomAttributes(GetType(RealMcCoy), True), RealMcCoy())
If attr.Length > 0 Then
' bingo, baby...optional extra test:
If attr(0).IsReal Then
Console.Beep()
End If
Else
' skip this prop - its not a real mccoy
End If
Next
End Sub
것을 폴링이지만,보다 깨지기 각 Types를 해당 구성 속성으로 업데이트해야합니다. 위조 된 인터페이스는 질의하기 쉽지만 동일한 단점이 있습니다.
"게임"문제에 대해 잘 모르겠습니다 - 다른 유형이 선택 될까봐 걱정됩니까? 애트리뷰트는 어셈블리로 컴파일되기 때문에 "게임하기"어려울 것입니다. 위의 코드는 bool보다는 GUID (어쩌면 어셈블리에 첨부 된 것일 수도 있습니다)를 반환하는 데 사용할 수 있습니다.
절대 확실성을 찾기가 어려울 것입니다.
RealMcCoy
속성
아마 다른 유형의 속성으로 사용되는 최상위 수준의 유형 (
PatientAppointment
) 단지 종류 (클래스)에 적용되지 않습니다. 객체는이를 쉽게 식별 할 수있는 방법입니다.
사용 방법에 따라 TypeName-PropertyName 쌍의 사전 또는 해시 테이블 이미이 RealMcCoys으로 식별되어 유용 할 수 있으므로 전체 반사 프로세스가 단락 될 수 있습니다. 즉석에서 추가하기보다는 shown in this answer으로 전체 목록을 작성할 수 있습니다 (RangeManager.BuildPropMap
절차 참조).
실제로 상속을 어딘가에서 사용하고자 할 수도 있으므로 상속 접근법에 대해서는 확신 할 수 없습니다. 인터페이스가 더 잘 작동 할 수도 있습니다. 처음에는 단순한 존재가 시작시 트리거가 될 수 있지만 서비스를 제공하는 데 사용될 수도 있습니다.
간단한 테스트 케이스 :
' B and C classes are not tagged
Friend Class FooBar
Public Property Prop1 As PropA
Public Property Prop2 As PropB
Public Property Prop3 As PropC
Public Property Prop4 As PropD
Public Property Prop5 As PropE
End Class
루프의에 행을 추가
Dim f As New FooBar
' use instance:
Dim props As PropertyInfo() = f.GetType.GetProperties
Dim pt As Type
For Each pi As PropertyInfo In props
pt = pi.PropertyType
Dim attr() As RealMcCoy =
DirectCast(pt.GetCustomAttributes(GetType(RealMcCoy), True), RealMcCoy())
Console.WriteLine("Prop Name: {0}, prop type: {1}, IsRealMcCoy? {2}",
pi.Name, pt.Name, If(attr.Length > 0, "YES!", "no"))
Next
출력 : Plutonix에
Prop Name: Prop1 prop type: PropA IsRealMcCoy? YES!
Prop Name: Prop2 prop type: PropB IsRealMcCoy? no
Prop Name: Prop3 prop type: PropC IsRealMcCoy? no
Prop Name: Prop4 prop type: PropD IsRealMcCoy? YES!
Prop Name: Prop5 prop type: PropE IsRealMcCoy? YES!
그리고 어떤 오류가 발생합니까? – BradleyDotNET
'PatientAppointment'를 얼마나 정확하게 반복 하시겠습니까? 재귀 적으로 반복하고 싶습니까 ('PatientAppointment'의 각 속성과'Pat'와'Appt'의 각 속성을 반복합니다)? 아니면 속성이 클래스인지 여부를 알고 싶습니까? –
- 오류가 표시되지 않습니다. –