2012-06-28 2 views
0

вот простой пример, чтобы очистить мои намерения.Настройка свойств из одного класса в другой с помощью GetProperties

class A { 
    public int Id 
    public string Name 
    public string Hash 
    public C c 
} 
class B { 
    public int id 
    public string name 
    public C c 
} 
class C { 
    public string name 
} 
var a = new A() { Id = 123, Name = "something", Hash = "somehash" }; 
var b = new B(); 

Я хочу, чтобы установить свойства b «s из a. Я пробовал что-то, но не повезло.

public void GenericClassMatcher(object firstModel, object secondModel) 
    { 
     if (firstModel != null || secondModel != null) 
     { 
      var firstModelType = firstModel.GetType(); 
      var secondModelType = secondModel.GetType(); 
      // to view model 
      foreach (PropertyInfo prop in firstModelType.GetProperties()) 
      { 
       var firstModelPropName = prop.Name.ElementAt(0).ToString().ToLower(System.Globalization.CultureInfo.InvariantCulture) + prop.Name.Substring(1); // lowercase first letter 
       if (prop.PropertyType.FullName.EndsWith("Model")) 
       { 
        GenericClassMatcher(prop, secondModelType.GetProperty(firstModelPropName)); 
       } 
       else 
       { 
        var firstModelPropValue = prop.GetValue(firstModel, null); 
        var secondModelProp = secondModelType.GetProperty(firstModelPropName); 
        if (prop.PropertyType.Name == "Guid") 
        { 
         firstModelPropValue = firstModelPropValue.ToString(); 
        } 
        secondModelProp.SetValue(secondModel, firstModelPropValue, null); 
       } 
      } 
     } 
    } 

Что мне делать?

+1

Необходимо перечислить поля и свойства. ('Type.GetFields()'). Примеры классов, которые вы указали, имеют только поля. –

+0

Я также добавил свойство. –

+1

не связан с основной проблемой, но я думаю, что вы должны заменить это 'if (firstModel! = Null || secondModel! = Null)' by 'if (firstModel! = Null && secondModel! = Null)' –

ответ

1

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

public class A 
    { 
     public int Id; 
     public string Name; 
     public string Hash; 
     public C c; 
    } 

    public class B 
    { 
     public int id; 
     public string name; 
     public C c; 
    } 

    public class C 
    { 
     public string name; 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      var a = new A() { Id = 123, Name = "something", Hash = "somehash" }; 
      var b = new B(); 

      AutoMapper.Mapper.CreateMap<A, B>(); 

      b = AutoMapper.Mapper.Map<A, B>(a); 


      Console.WriteLine(b.id); 
      Console.WriteLine(b.name); 

      Console.ReadLine(); 
     } 
} 
+0

Да, но перед сопоставлением мне нужно преобразовать имя поля. –

+0

@fastreload Я не могу сказать, какое преобразование нужно сделать на основе вашего вопроса, но AutoMapper может справиться с этим. – cadrell0

+0

В AutoMapper есть хороший синтаксис лямбда. Работа над образцом для вас. –

Смежные вопросы