Мне было интересно узнать, насколько я могу разглядеть разницу в производительности от других, имеющих опыт отражения и объекты DTO внутри службы WCF. У меня есть код ниже, который я использовал для создания объекта DTO из объекта Entity с использованием Linq.Отражение для создания объектов DTO в WCF
using (dashEntities context = new dashEntities())
{
result = context.GetAlerts().Select(m => new AlertItemDTO()
{
}).ToList();
Другой программист при создании своей службы WCF написал Generic метод с помощью отражения, чтобы сделать то же самое преобразование:
private object TransferEntityToDTO(object dto, object entity)
{
Type entityType = entity.GetType();
// Use reflection to get all properties
foreach (PropertyInfo propertyInfo in entityType.GetProperties())
{
if (propertyInfo.CanRead)
{
List<PropertyInfo> dtoProperties = dto.GetType().GetProperties().ToList();
foreach (PropertyInfo dtoProperty in dtoProperties)
{
if (dtoProperty.Name == propertyInfo.Name)
{
object value = propertyInfo.GetValue(entity, null);
if (value != null && value.ToString() != "" && value.ToString() != "1/1/0001 12:00:00 AM")
{
// This section gets the type of of the property and casts
// to it during runtime then sets it to the corresponding
// dto value:
// Get current class type
Type currentClassType = this.GetType();
//Get type of property in entity object
Type propertyType = Type.GetType(propertyInfo.PropertyType.FullName);
// Get the Cast<T> method and define the type
MethodInfo castMethod = currentClassType.GetMethod("Cast").MakeGenericMethod(propertyType);
// Invoke the method giving value its true type
object castedObject = castMethod.Invoke(null, new object[] { value });
dtoProperty.SetValue(dto, value, null);
}
break;
}
}
}
}
return dto;
}
/// <summary>
/// Used in TransferEntityToDTO to dynamically cast objects to
/// their correct types.
/// </summary>
/// <typeparam name="T">Type to cast object to</typeparam>
/// <param name="o">Object to be casted</param>
/// <returns>Object casted to correct type</returns>
public static T Cast<T>(object o)
{
return (T)o;
}
Очевидно, что второй метод труднее читать и более длительный, но более общий и может использоваться в нескольких службах.
Мой вопрос заключается в возможности сделать его общим, перевешивая производительность при использовании отражения, а если нет, то почему? Я нашел много путаных статей и ответов на то, что делает размышление дорогостоящим. Я предполагаю, что часть его заключается в том, что она должна искать объект, который ему нужен, даже не зная, вроде как использовать Generic Exception для всего, когда вы знаете, какое исключение вы получите.
Может кто-то пролить свет на это для меня, пожалуйста. Спасибо
Благодарим вас за понимание, поскольку я не знал об этой библиотеке и других подобных, которые уже учитывали эти вещи. На данный момент, из-за нехватки времени, чтобы проверить его и других подобных, я хотел бы придерживаться этих двух сценариев, чтобы увидеть, что лучше использовать? По крайней мере, время от времени в течение следующих нескольких месяцев тестируйте и вводите эти новые библиотеки. – gcoleman0828
@ gcoleman0828: Я предлагаю вам не сворачивать собственное решение и вместо этого использовать библиотеки. Они сложны только под капотом, но на самом деле очень просты в использовании. Они также хорошо протестированы и предлагают отличную производительность. –