Кодпреобразование класса с помощью атрибутов
public class Test1
{
[Conversion("UserId")]
Public int id { get; set; }
[Conversion("UserValue")]
public int value { get; set; }
[Conversion("UserInfo")]
public List<Test2> info { get; set; }
}
public class User
{
public int UserId { get; set; }
public int UserValue { get; set; }
public List<UserInformation> UserInfo { get; set; }
}
public class Test2
{
[Conversion("UserId")]
public int id { get; set; }
[Conversion("UserName")]
public string name { get; set; }
[Conversion("UserLocation")]
public string location { get; set; }
}
public class UserInformation
{
public int UserId { get; set; }
public string UserName { get; set; }
public string UserLocation { get; set; }
}
public class ConversionAttribute
{
public string Name { get; set; }
public ConversionAttribute(string name)
{
this.Name = name;
}
}
public dynamic Convert(dynamic source, Type result)
{
var p = Activator.CreateInstance(result);
foreach (var item in source.GetType().GetProperties().Where(m => m.GetCustomAttributes(typeof(ConversionAttribute)).Count() > 0))
{
p.GetType().GetProperty(item.GetCustomAttributes(typeof(ConversionAttribute)).Cast<ConversionAttribute>().Name).Value = item.GetValue(source,null); // This should work for system types... but not for lists/custom models.
}
}
public void DoShit()
{
var t1 = new Test1 { id = 1, name = value = "Test", info = new Test2 { id = 1, name = "MyName", location = "UserLocation" } };
var obj = Convert(t1, typeof(User));
}
Ситуация
Я была поставлена задача превратить нашу модель базы данных для нашей модели WCF. Они отличаются несколькими способами, которые я показал немного в приведенном выше примере кода.
Мне удалось создать экземпляры с использованием Activator.CreateInstance(result)
, и я могу использовать source.GetType().GetProperties()
, чтобы скопировать все свойства, но у меня, похоже, проблема, связанная с моделью (пользовательским классом) или списком.
Проблема
Я понятия не имею, как обрабатывать пользовательские классы или списки (оба типа системы Aswell как пользовательские классы).
В моем старом методе я использовал два метода: один для обычного преобразования и один для преобразования списка. Но мой босс не одобрил его, поэтому я хотел бы знать, возможно ли иметь один метод для каждое использование без проверки того, что тип - это список, пользовательский класс или системный тип
Основная причина, по которой это должно быть полностью общим и с использованием атрибутов, состоит в том, что мы планируем использовать этот метод в нескольких проектах, а также более 100 моделей.
Есть ли причина, по которой вы не можете переделать свой db, чем использовать ORM, например Entity Framework, для повторного импорта классов модели? – Didaxis
Наша база данных полностью динамична, для одной модели поле может означать «Имя», но для другого это может означать «описание» –
Если вы не хотите обрабатывать событие evry отдельно, вы можете обернуть свой тип источника с помощью специального DynamicObject, который будет маршрутизировать свойство acess вызывает ваш тип источника. – user629926