Я передаю 2 общих объекта и строку в функцию, и я хотел бы найти свойство объектов, соответствующих строке, и сравнить их значения.
Вот образец модели:
Public Structure Foo
Public Bar As String
Public Nan As String
Public Tucket As String
End Structure
И вызывающий класс:
<TestMethod()>
Public Sub TestEquality_Class_Pass_Identifier()
_tester = new GeneralAssert
Dim expectedFoo = New Foo With {.Bar = "asdf", .Nan = "zxcv", .Tucket = "qwer"}
Dim actualFoo = New Foo With {.Bar = "qwer", .Nan = "zxcv", .Tucket = "qwer"}
_tester.TestEquality(expectedFoo, actualFoo, "Bar")
End Sub
Класс Generic Assert, который будет выполнять бизнес-логику
Public Class GenericAssert
Public Sub TestEquality(Of t)(expected As t, actual As t, Optional identifier As String = Nothing)
Dim expectedType = expected.GetType(), actualType = actual.GetType()
Assert.AreEqual(expectedType, actualType)
If (Not identifier Is Nothing) Then
Dim expectedProperty = expectedType.GetMember(identifier).FirstOrDefault()
Dim actualProperty = actualType.GetMember(identifier).FirstOrDefault()
TestEquality(*WhatHere1*, *WhatHere2*)
End If
End Sub
End Class
Ожидаемый результат будет заключаться в том, что будет сравниваться член Bar expectedFoo
("asdf") и actualFoo
("qwer"). Я не могу найти никакого значения в FieldInfo, PropertyInfo или MemberInfo, которое позволило бы мне получить значение, присвоенное этому свойству по имени.
2 ответа
Поскольку известны как природа структуры, так и то, что проверяется, я использовал объекты FieldInfo как наиболее простой способ получить значения полей.
Public Sub TestEquality(Of t)(expected As t, actual As t, Optional identifier As String = Nothing)
Dim expectedType = expected.GetType()
Dim actualType = actual.GetType()
Assert.AreEqual(expectedType, actualType)
If (identifier IsNot Nothing) Then
Dim expectedField As FieldInfo = expectedType.GetField(identifier, BindingFlags.IgnoreCase Or BindingFlags.Public Or BindingFlags.Instance)
Dim actualField As FieldInfo = actualType.GetField(identifier, BindingFlags.IgnoreCase Or BindingFlags.Public Or BindingFlags.Instance)
Assert.AreEqual(expectedField.GetValue(expected), actualField.GetValue(actual))
End If
End Sub
Я не понимаю, почему в данном случае этого не будет:
Public Sub AssertEquality(Of T)(ByVal expected As T, ByVal actual As T, identifier As String)
Dim expected_prop = expected.GetType().GetProperty(identifier, BindingFlags.Instance + BindingFlags.Public)
Dim actual_prop = actual.GetType().GetProperty(identifier, BindingFlags.Instance + BindingFlags.Public)
Dim expected_value = expected_prop.GetValue(expected, Nothing)
Dim actual_value = actual_prop.GetValue(actual, Nothing)
Assert.AreEqual(expected_value, acutal_value)
End Sub
Sub Main()
Dim expectedFoo = New Foo With {.Bar = "asdf", .Nan = "zxcv", .Tucket = "qwer"}
Dim actualFoo = New Foo With {.Bar = "qwer", .Nan = "zxcv", .Tucket = "qwer"}
AssertEquality(expectedFoo, actualFoo, "Bar")
End Sub
GetValue()
может быть только целым или длинным в соответствии с моим компилятором. Где expected
имеет тип t (или Foo во время выполнения)
expected_prop.GetValue(expected)
не имеет смысла...
Похожие вопросы
Связанные вопросы
Новые вопросы
.net
НЕ используйте для вопросов о .NET Core - используйте вместо этого [.net-core]. .NET Framework - это программная среда, предназначенная главным образом для операционной системы Microsoft Windows. Он включает в себя реализацию библиотеки базовых классов, общеязыковой среды выполнения (обычно называемой CLR), общей системы типов (обычно называемой CTS) и динамической среды исполнения. Он поддерживает множество языков программирования, включая C #, VB.NET, F # и C ++ / CLI.
.GetValue()
этого не сделает?expectedId.GetValue()
ожидает, что я передам объект, но expectId — это объект Bar, поэтому мне нечего передавать.expected
не имеет.GetValue()
expectedProperties.GetValue()
, если вы установили, что он называетсяidentifier
. Вы передаете экземплярexpectedFoo
expectedProperties
имеет типMemberInfo()
.expectedProperties.GetValue(expectedId)
имеет ошибку компилятора "Неверные типы аргументов. Кандидаты - Integer или Long.