Pregunta

Esta pregunta ya tiene una respuesta aquí:

Tengo una colección de objetos que paso como parámetro para crear objetos de otro tipo (uno para uno). Estoy haciendo esto en muchos lugares (básicamente convirtiendo de objetos de datos a objetos comerciales). Quiero escribir un método de extensión genérica para lograr esto. Pero estoy atascado porque no sé cómo puedo especificar la restricción de que el objeto comercial tiene un constructor que toma el objeto de datos como parámetro. El siguiente es el código de mi función:

public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list) 
                    where T : new(A)/*THIS IS PROBLEM PART*/
{
    var ret = new List<T>();

    foreach (var item in list)
    {
        ret.Add(new T(item));
    }
    return ret;
}
¿Fue útil?

Solución

Desafortunadamente, esto no está permitido en C#. Puedes tener un new() La restricción que obliga al tipo a tener un constructor predeterminado, pero esa es la única restricción relacionada con el constructor admitida por .NET.

Es probable que su mejor opción sea definir una interfaz que pueda usar y limitar a la interfaz. En lugar de intentar establecer el objeto en la construcción, puede tener un método de estilo "inicializar" que toma el objeto "un", y llamarlo.

Otros consejos

No puede restringir a los constructores de tipo genérico de esta manera (solo para requerir un constructor sin parámetros), pero podría tomar un delegado para hacer la construcción:

public static IList<T> ConvertTo<A, T>(this IEnumerable<A> list, Func<A, T> constructionFunc)
{
    return list.Select(constructionFunc).ToList();
}

Y úsalo así:

var IList<T> converted = someSequence.ConvertTo(a => new T(a));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top