Статьи

Общий метод расширения для отображения объектов из одного типа в другой

Позвольте мне начать с одного сценария. Просто представьте, что у нас есть объект с множеством открытых свойств, и нам нужно использовать только некоторые его свойства для метода профиля пользователя. Например, у нас есть класс  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;  
        }  
          
    }  
}  

Заключение

В этой статье я объяснил, как мы можем выполнить умную работу вместо тяжелой работы, чтобы скопировать те же свойства объекта класса в другой объект класса.

Я надеюсь, что эта статья будет полезна и полезна где-то в вашем проекте. Пожалуйста, оставьте ценный отзыв и поделитесь с друзьями, чтобы они могли использовать этот метод.