看同事使用的 一個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 效率其實也還不錯。