Возможно, вы ищете способ идентифицировать свои типы с определенным уровнем уверенности. Одним из способов может быть использование настраиваемого атрибута, который будет легко найти и фильтровать с помощью Reflection.
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
Теперь при переборе свойств, проверьте, если это RealMcCoy
, чтобы увидеть, если это тот, который вы хотите/нужно просверлить в. Так как атрибут будет на тип, есть дополнительный шаг, чтобы получить тип каждого свойства и опрашивать что
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
Он ломает, если вы добавите тип И не добавить атрибут, но менее хрупким, чем чтобы обновить каждый тип для своих составных свойств. Поддельный интерфейс будет проще запрашивать, но имеет тот же недостаток.
Я не уверен, что понимаю проблему «игр» - вы боитесь, что некоторые другие типы будут подняты? Атрибуты были бы трудными для «игры», поскольку они были скомпилированы в сборку, но все же вышеупомянутое может быть использовано для возврата GUID (возможно, одного, прикрепленного к сборке?), А не bool, чтобы обеспечить некоторую уверенность.
Абсолютная уверенность будет трудно найти.
Атрибут RealMcCoy
вероятно, не будут применяться к вашим топ типов уровня (PatientAppointment
) только типы (классы), которые будут использоваться в качестве свойств других типов. Объект является способом их легко идентифицировать.
В зависимости от того, как он используется, словарь или хеш-таблица пар типаName-PropertyName уже, идентифицированные как RealMcCoys, могут быть полезны, поэтому весь процесс Reflection может быть закорочен. Вместо того, чтобы добавлять «на лету», вы можете составить список целиком в целом как 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
Выход:
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')? Или вы просто хотите знать, является ли свойство классом или нет? –
- Я не получаю сообщение об ошибке. –