Set object property using reflection

后端 未结 10 1674
终归单人心
终归单人心 2020-11-21 23:22

Is there a way in C# where I can use reflection to set an object property?

Ex:

MyObject obj = new MyObject();
obj.Name = \"Value\";

10条回答
  •  情深已故
    2020-11-21 23:56

    Based on MarcGravell's suggestion, I have constructed the following static method.The method generically assigns all matching properties from source object to target using FastMember

     public static void DynamicPropertySet(object source, object target)
        {
            //SOURCE
            var src_accessor = TypeAccessor.Create(source.GetType());
            if (src_accessor == null)
            {
                throw new ApplicationException("Could not create accessor!");
            }
            var src_members = src_accessor.GetMembers();
            if (src_members == null)
            {
                throw new ApplicationException("Could not fetch members!");
            }
            var src_class_members = src_members.Where(x => x.Type.IsClass && !x.Type.IsPrimitive);
            var src_class_propNames = src_class_members.Select(x => x.Name);
            var src_propNames = src_members.Except(src_class_members).Select(x => x.Name);
    
            //TARGET
            var trg_accessor = TypeAccessor.Create(target.GetType());
            if (trg_accessor == null)
            {
                throw new ApplicationException("Could not create accessor!");
            }
            var trg_members = trg_accessor.GetMembers();
            if (trg_members == null)
            {
                throw new ApplicationException("Could not create accessor!");
            }
            var trg_class_members = trg_members.Where(x => x.Type.IsClass && !x.Type.IsPrimitive);
            var trg_class_propNames = trg_class_members.Select(x => x.Name);
            var trg_propNames = trg_members.Except(trg_class_members).Select(x => x.Name);
    
    
    
            var class_propNames = trg_class_propNames.Intersect(src_class_propNames);
            var propNames = trg_propNames.Intersect(src_propNames);
    
            foreach (var propName in propNames)
            {
                trg_accessor[target, propName] = src_accessor[source, propName];
            }
            foreach (var member in class_propNames)
            {
                var src = src_accessor[source, member];
                var trg = trg_accessor[target, member];
                if (src != null && trg != null)
                {
                    DynamicPropertySet(src, trg);
                }
            }
        }
    

提交回复
热议问题