2012-07-11 6 views
9

Si uso genéricos, como en este caso de ejemplo, ¿hay alguna forma de acortar la sintaxis para no tener que escribir repetidamente "CompanyLookupData"?C# ¿Acortar la sintaxis cuando se usa el tipo repetidamente en genéricos?

Func<CompanyLookupData, CompanyLookupData, bool> DELCompareNonKeyFieldsCompany = 
    new Func<CompanyLookupData, CompanyLookupData, bool> 
    (CompanyLookupData.HasIdenticalNonKeyFieldsTo); 

que había tratado de hacer Type t = typeof(CopmanyLookupData), y utilizar t en todos los lugares, pero eso no parece funcionar.

PD: aunque estoy abierto a una manera más limpia de hacer exactamente lo que se muestra, estoy más interesado en una forma de hacer que la sintaxis de los genéricos sea más concisa en general.

+0

¿Qué hay de cambiar el nombre del tipo de CompanyLookupData a algo más corto. cualquier otra cosa, haría que tu código fuera menos legible – saj

+0

Podría, pero no quiero cambiar el nombre de mis clases cada vez que necesite usarlas en un delegado, jaja. :) –

Respuesta

7

Sí, hay algunas maneras de lograr esto:

Si la variable es una variable local se puede utilizar el var palabra clave:

var DELCompareNonKeyFieldsCompany = new Func<CompanyLookupData, CompanyLookupData, bool> (CompanyLookupData.HasIdenticalNonKeyFieldsTo); 

Sin embargo, si DELCompareNonKeyFieldsCompany es una variable de clase (una campo o una propiedad) puede dejar que el compilador inferir algo de él para usted mediante la conversión de un grupo a un método Func:

Func<CompanyLookupData, CompanyLookupData, bool> DELCompareNonKeyFieldsCompany = CompanyLookupData.HasIdenticalNonKeyFieldsTo; 

Si este tipo se va a utilizar con frecuencia, es posible que desee crear su propio tipo de delegado:

public delegate bool CompareCompanyNonKeyFields(CompanyLookupData, CompanyLookupData); 

y el uso que de este modo:

CompareCompanyNonKeyFields DELCompareNonKeyFieldsCompany = CompanyLookupData.HasIdenticalNonKeyFieldsTo; 

Alternativamente, si el tipo es sólo para ser utilizado dentro de la clase uno, usted podría también crear un alias para el tipo con la palabra clave using (aunque, personalmente, me parece que esto dificulta la legibilidad del código):

using CompareCompanyNonKeyFields = System.Func<CompanyLookupData, CompanyLookupData, bool>; 
... 
CompareCompanyNonKeyFields DELCompareNonKeyFieldsCompany = CompanyLookupData.HasIdenticalNonKeyFieldsTo; 
+0

¿En lugar de "campo" probablemente significa "propiedad"? –

+0

Gracias, me gusta la variedad :) –

0

No, no puedes hacer algo fundamentalmente mejor que esto. Para bien o para mal, C# no tiene el equivalente moral de typedef.

Lo que usted podría intentar es un using alias para acortar el nombre del tipo, aunque personalmente creo que esto no es una buena idea:

using CLD = CompanyLookupData; 

Func<CLD, CLD, bool> DELCompareNonKeyFieldsCompany = 
    new Func<CLD, CLD, bool> (CLD.HasIdenticalNonKeyFieldsTo); 

Otra posibilidad (mucho menos probable que sea aplicable en la práctica) es utilice una variable implícitamente tipada (var) si estamos hablando de un local.

2

puede utilizar var, a s horten un poco :)

var DELCompareNonKeyFieldsCompany = new Func<CompanyLookupData, CompanyLookupData, bool>(CompanyLookupData.HasIdenticalNonKeyFieldsTo); 
2

La única forma en que puedo pensar es en usar la declaración.

using cld = MyNamespace.CompanyLookupData; 

continuación, puede utilizar la EPC en lugar del nombre completo en el resto del archivo.

4

Tomar la declaración using para declarar un alias:

using MyType = System.Func<CompanyLookupData, CompanyLookupData, bool>; 

MyType DELCompareNonKeyFieldsCompany = new MyType(CompanyLookupData.HasIdenticalNonKeyFieldsTo); 
3

se puede ocultar en un método de fábrica ayudante:

void Main() { 
    var f1 = Helper.Create(CompanyLookupData.HasIdenticalNonKeyFieldsTo); 
    var f2 = Helper.Create(CompanyLookupData.HasIdenticalNonKeyFieldsTo); 
} 

static class Helper { 
    public static Func<T, T, bool> Create<T>(Func<T, T, bool> @delegate) { 
     return @delegate; 
    } 
} 
Cuestiones relacionadas