使用 Attribute +反射 來對兩個類之間動態賦值

atliwen發表於2015-09-29

看同事使用的 一個ORM 框架 中 有這樣一個功能  通過特性(附加屬性)的功能來 實現的兩個類物件之間動態賦值的 功能  

覺得這個功能不錯,但是同事使用的 ORM 並不是我使用的  Dapper  所以就自己寫了一個實現同樣功能的 工具類出來。

發個貼 為其他有這方面需求的人 來做個參考。 希望大家多提點意見。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            AnimalTypeTestClass testClass = new AnimalTypeTestClass() { Age = "1", Name = "2"};
            Na a = (Na)ClassToHellp.Map<Na>(testClass);
            Console.WriteLine(a.MyAge);
            Console.WriteLine(a.MyName);
        }
    }
    public class ClassToHellp
    {
        public static object Map<T>(object os) where T : class, new()
        {
            // 被轉換的類
            var t = new T();
            var fieldInfos = t.GetType().GetFields();
            foreach (var mInfo in os.GetType().GetFields())
            {
                var mInfoValue = mInfo.GetValue(os);
                if (mInfoValue == null)
                    continue;
                foreach (var field in Attribute.GetCustomAttributes(mInfo)
                    .Where(attr => attr.GetType() == typeof(ObjectToTypeAttribute))
                    .SelectMany(attr => fieldInfos.Where(field => field.Name == ((ObjectToTypeAttribute)attr).Field)))
                {
                    field.SetValue(t, mInfoValue);
                }
            }
            return t;
        }

    }

    [AttributeUsage(AttributeTargets.Field)]
    public class ObjectToTypeAttribute : Attribute
    {
        public string Field { get; set; }
        public ObjectToTypeAttribute(string pet)
        {
            Field = pet;
        }
    }

    public class AnimalTypeTestClass
    {
        [ObjectToType("MyName")]
        public string Name;
        [ObjectToType("MyAge")]
        public string Age;

    }

    public class Na
    {
        public string MyName;

        public string MyAge;

    }
}

 

請不要吐槽 使用反射 效率問題。 在不載入DLL 的前提下 反射的效率還是很高的。

同樣 在實體類只是對 欄位經行篩選 判斷 的LINQ 效率其實也還不錯。

 

相關文章