Tengo 3 clases que son esencialmente las mismas pero no implemento una interfaz porque todas provienen de diferentes servicios web.C# Genéricos: ¿Puedo restringir a un conjunto de clases que no implementan una interfaz?
p. Ej.
- Service1.Object1
- Service2.Object1
- Service3.Object1
Todos ellos tienen las mismas propiedades y le escribo algo de código para asignar el uno al otro mediante el cual un objeto intermediario implementa mi propia interfaz IObject1
he hecho esto utilizando genéricos
public static T[] CreateObject1<T>(IObject1[] properties)
where T : class, new()
{
//Check the type is allowed
CheckObject1Types("CreateObject1<T>(IObject1[])", typeof(T));
return CreateObjectArray<T>(properties);
}
private static void CheckObject1Types(string method, Type type)
{
if (type == typeof(Service1.Object1)
|| type == typeof(Service2.Object1)
|| type == typeof(Service3.Object1)
|| type == typeof(Service1.Object1[])
|| type == typeof(Service2.Object1[])
|| type == typeof(Service3.Object1[]))
{
return;
}
throw new ArgumentException("Incorrect type passed to ServiceObjectFactory::" + method + ". Type:" + type.ToString());
}
Mi código de cliente se parece a:
//properties is an array of my intermediary objects
Object1[] props = ServiceObjectFactory.CreateObject1<Object1>(properties);
Lo que quiero hacer es deshacerse del método CheckObject1Types y el uso de restricciones en su lugar para que me sale un error de generación si los tipos no son válidas, porque en el momento en que puedo llamar a este método con cualquier tipo y el método CheckObject1Types arroja ArgumentException.
Así que me gustaría hacer algo como:
public static T[] CreateObject1<T>(IObject1[] properties)
where T : class, new(), Service1.Object1|Service2.Object1|Service3.Object1
{
return CreateObjectArray<T>(properties);
}
¿Alguna idea?
Editar: No quiero cambiar los archivos Reference.cs para cada servicio web porque todo lo que se necesita es un compañero de equipo para actualizar la referencia web y BAM! código roto
Me acabo de dar cuenta de que puedo mejorar la eficiencia del código de tipos de cheque al cambiarlo de && a || y! = a == antes de que alguien lo señale. –