В простейших для вот то, что я хочу сделать:Как преобразовать производные типы интерфейса?
interface InterfaceA
{
string var1 { get; set; }
string var2 { get; set; }
}
public class DerivedA : InterfaceA
{
public string var1 { get; set; }
public string var2 { get; set; }
}
public class DerivedB : InterfaceA
{
public string var1 { get; set; }
public string var2 { get; set; }
}
public class DoEverything
{
InterfaceA A = new DerivedA();
InterfaceA B = new DerivedB();
A.var1 = "Test1";
A.var2 = "Test2";
B = ConvertObject<DerivedB>(A);
write(B.var1 + ", " + B.var2);
// This doesn't work, I would like it to though.
public T ConvertObject<T>(object obj)
{
T result = (T)typeof(T).GetConstructor(new Type[] { }).Invoke(new object[] { });
foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties())
{
if (propertyInfo.CanRead)
{
try
{
object value = propertyInfo.GetValue(obj, null);
propertyInfo.SetValue(result, value, null);
}
catch { }
}
}
return result;
}
}
Сейчас я должен вручную преобразовать каждое свойство в своих объектах и при добавлении нового свойства я должен помнить, чтобы пойти методы преобразования и добавьте его. Я бы предпочел, чтобы это было сделано автоматически.
Любая помощь была бы принята с благодарностью.
заранее спасибо
Причиной этого является мой бизнес слой имеет общий фиктивный класс, который просто получает и устанавливает каждое свойство для интерфейса. Мой реальный класс, хотя и недоступен для бизнес-уровня. Мне нужно сериализовать реальный класс и отправить его в webservice для вычислений. Я не могу сериализовать интерфейс, и мой оригинальный класс не реализован в моем бизнес-слое по причинам, которые меня расстраивают, но я не могу контролировать. Поэтому мне нужно преобразовать свой первоначальный класс в мой фиктивный класс и затем сериализовать. Добавление конструктора, использующего тип интерфейса, не помогает, потому что я мог бы так же легко ... – ClaytonHunt
объявить класс как DerivedB B = новый DerivedB() {blah = A.blah и т. Д.}, Который по-прежнему требует ручного перевода от A до B – ClaytonHunt
Это еще простой ответ, потому что вы работаете с известным интерфейсом. В вашем фиктивном классе реализуйте методы FromA и ToA, из которых eaxh принимает InterfaceA как один аргумент. FromA получает значения свойств из arg, ToA делает обратное. Вам не нужно отражать, если вы знаете, что такое InterfaceA. –