Я использую отражение для отображения (установки свойств) одного класса (xSearchObject) из DTO (xSearchQuery). Я попытался сократить код, чтобы было легче увидеть, чего я пытаюсь достичь. Я не могу изменить SearchField
, но могу изменить DTOSearchField
.
- Исходный класс имеет n свойств типа
DTOSearchField<T>
. - Целевой класс имеет n свойств типа
SearchField<T>
. - Источник и место назначения имеют одинаковое количество свойств с одинаковыми именами.
Тип свойства исходного класса
public class DTOSearchField<T> : IDTOSearchField
{
public T EqualTo;
}
Тип свойства целевого класса:
public class SearchField<T> : ISearchField
{
public void WhereEquals(T value)
{
_clauses.Add(_name + " = " + Converter.ConvertValueToSql(value));
}
// etc
}
Сопоставление: (на основе облегченного объекта в Object Mapper) Я вполне могу сделать сопоставление, если вместо универсального DTOSearchField<T>
у меня есть, например, классы StringDTOSearchField
, IntDTOSearchField
и т.д., и я приведу их к ним. Итак, для каждого исходного свойства:
if (sourceVal.GetType().IsAssignableFrom(typeof(StringDTOSearchField)))
{
var destinationProperty = destinationPropertyAccessor.GetPropertyValue(destination, propertyMatch.DestinationProperty.Name) as SearchField<string>;
var sourceStringField = sourceVal as StringSearchField;
if (sourceStringField != null)
{
if (!string.IsNullOrEmpty(sourceStringField.EqualTo)) destinationProperty.WhereEquals(sourceStringField.EqualTo);
}
}
else if (sourceVal.GetType().IsAssignableFrom(typeof(IntDTOSearchField)))
{
// Etc
}
Или я мог бы оставить общий DTOSearchField<T>
и выполнить загрузку If-Then-elses на основе:
Type t = sourceVal.GetType().GetGenericArguments()[0];
привести к соответствующему типу,
Но я чувствую, что должен быть в состоянии сделать что-то вроде:
Type t = sourceVal.GetType().GetGenericArguments()[0];
var destinationProperty = destinationPropertyAccessor.GetPropertyValue(destination, propertyMatch.DestinationProperty.Name) as SearchField<t>;
destinationProperty.WhereEquals(sourceVal.EqualTo.Value);
Поскольку sourceVal
— это DTOSearchField<T>
, а destinationProperty
— это SearchField<T>
, и оба они имеют свойства типа T, кажется, что не должно иметь значения, если вы не знаете, что такое T, до времени выполнения.
Я понимаю, что актерский состав не будет работать, поскольку T неизвестен до времени выполнения. Есть ли способ добиться того, чего я хочу, кроме If-Then-Else для каждого возможного типа? Кажется, это лишает преимущества использования дженериков, если мне приходится это делать.
Спасибо,