(repetida de here)
En primer lugar - en cuenta que puede añadir constructores (y otro código) a las clases de WCF: solo tienes que hacerlo en una clase parcial (y dejar solo el código generado).
suena como el tipo de los elementos de la lista que haya que cambiar - por lo que no se puede simplemente fundido. La reflexión es una opción, pero es lenta. Dado que está utilizando 3.5, tal vez podamos escribir un Expression
que lo haga por nosotros de manera más eficiente a lo largo de ... these lines, pero el uso de la segunda clase también:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
static class Program
{
class Foo
{
public int Value { get; set; }
public override string ToString()
{
return Value.ToString();
}
}
class Bar : Foo {}
static void Main()
{
List<Foo> foos = new List<Foo>();
for (int i = 0; i < 10; i++) foos.Add(new Foo { Value = i });
List<Bar> bars = foos.ConvertAll<Bar>(Clone<Foo, Bar>);
}
public static TTo Clone<TFrom, TTo>(this TFrom obj) where TTo : TFrom, new()
{
return ObjectExtCache<TFrom, TTo>.Convert(obj);
}
static class ObjectExtCache<TFrom, TTo> where TTo : TFrom, new()
{
private static readonly Func<TFrom, TTo> converter;
static ObjectExtCache()
{
ParameterExpression param = Expression.Parameter(typeof(TFrom), "in");
var bindings = from prop in typeof(TFrom).GetProperties()
where prop.CanRead && prop.CanWrite
select (MemberBinding)Expression.Bind(prop,
Expression.Property(param, prop));
converter = Expression.Lambda<Func<TFrom, TTo>>(
Expression.MemberInit(
Expression.New(typeof(TTo)), bindings), param).Compile();
}
public static TTo Convert(TFrom obj)
{
return converter(obj);
}
}
}
¿WCF no genera las clases _partial_ en el código proxy? –
En otro vistazo, no dijo si DerivedClass es solo una extensión funcional en la parte superior de la base o si realmente tiene que ser una estructura de datos diferente como lo sugiere la muestra del código. En mi humilde opinión, en el segundo caso, "conversión" no tiene sentido. –