Позвольте мне начать с одного сценария. Просто представьте, что у нас есть объект с множеством открытых свойств, и нам нужно использовать только некоторые его свойства для метода профиля пользователя. Например, у нас есть класс Teacher_Interview
и другой класс с именем Teacher_College
.
Public class Teacher_Interview
{
Public int UID {get; set;}
Public string Name {get; set;}
Public string Email {get; set;}
Public string Subject {get; set;}
}
Public class Teacher_College
{
Public int TID {get; set;}
Public string Name {get; set;}
Public string Email {get; set;}
}
Здесь мы написали оба класса. Как мы видим, у нас есть Teacher_Interview
класс, который содержит его общедоступные свойства. Теперь нам нужно использовать Teacher_College
объект класса и получить те же значения от Teacher_Interview
объекта класса.
Например, мы написали Teacher_Interview
объект.
Teacher_Interview ti = new Teacher_Interview()
{
UID = 101
Name = “Faisal Pathan”
Email = [email protected]
Subject = “.NET”
}
Теперь, в обычном случае, мы копируем / используем Teacher_Interview
значение объекта, Teacher_College
как показано ниже.
Teacher_College tc = new Teacher_College()
{
TID = ti.UID,
Name = ti.Name,
Email = ti.Email
}
Просто подумайте, что произойдет, если у нас будет 40-50 или более 50 объектов. В этом случае мы должны написать одну и ту же строку от 40 до 50 раз, что, безусловно, отнимает много времени и скучно. Также можно забыть назначить некоторые свойства, которые приведут к ошибке.
Итак, каково решение для этого?
Мы можем использовать System.reflection
пространство имен и классы.
Здесь я написал общий метод, а именно « MatchAndMap
», который копирует те же свойства имени из Teacher_Interview
объекта Teacher_College
класса в объект класса.
public static void MatchAndMap<TSource, TDestination>(this TSource source, TDestination destination)
where TSource : class, new()
where TDestination : class, new()
{
if (source != null && destination != null)
{
List<PropertyInfo> sourceProperties = source.GetType().GetProperties().ToList<PropertyInfo>();
List<PropertyInfo> destinationProperties = destination.GetType().GetProperties().ToList<PropertyInfo>();
foreach (PropertyInfo sourceProperty in sourceProperties)
{
PropertyInfo destinationProperty = destinationProperties.Find(item => item.Name == sourceProperty.Name);
if (destinationProperty != null)
{
try
{
destinationProperty.SetValue(destination, sourceProperty.GetValue(source, null), null);
}
catch (Exception ex)
{
}
}
}
}
}
Этот метод будет работать для нас и сопоставлять свойства с тем же именем. Но мы не будем вызывать этот метод напрямую. Мы будем вызывать из другого метода, который упоминается ниже.
public static TDestination MapProperties<TDestination>(this object mapSource)
where TDestination : class, new()
{
var destination = Activator.CreateInstance<TDestination>();
MatchAndMap(mapSource, destination);
return destination;
}
Activator.CreateInstance
сначала создает пустой экземпляр для нашего класса назначения и передает MatchAndMap
метод, а затем возвращается к месту назначения.
Теперь здесь, мы думаем, как вызвать или использовать этот метод. Итак, вот способ использовать этот метод.
var records = (Teacher_Interview_class_object).MapProperties<Teacher_College_class_object>();
Полный код класса
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace Faisal_Example.Extention
{
public static class MyExtensions
{
public static void MatchAndMap<TSource, TDestination>(this TSource source, TDestination destination)
where TSource : class, new()
where TDestination : class, new()
{
if (source != null && destination != null)
{
List<PropertyInfo> sourceProperties = source.GetType().GetProperties().ToList<PropertyInfo>();
List<PropertyInfo> destinationProperties = destination.GetType().GetProperties().ToList<PropertyInfo>();
foreach (PropertyInfo sourceProperty in sourceProperties)
{
PropertyInfo destinationProperty = destinationProperties.Find(item => item.Name == sourceProperty.Name);
if (destinationProperty != null)
{
try
{
destinationProperty.SetValue(destination, sourceProperty.GetValue(source, null), null);
}
catch (Exception ex)
{
}
}
}
}
}
public static TDestination MapProperties<TDestination>(this object source)
where TDestination : class, new()
{
var destination = Activator.CreateInstance<TDestination>();
MatchAndMap(source, destination);
return destination;
}
}
}
Заключение
В этой статье я объяснил, как мы можем выполнить умную работу вместо тяжелой работы, чтобы скопировать те же свойства объекта класса в другой объект класса.
Я надеюсь, что эта статья будет полезна и полезна где-то в вашем проекте. Пожалуйста, оставьте ценный отзыв и поделитесь с друзьями, чтобы они могли использовать этот метод.