2012-07-11 5 views
9

Se utilizzo i generici, come in questo esempio di caso, c'è un modo per abbreviare la sintassi in modo da non dover digitare ripetutamente "CompanyLookupData"?C# Accorcia la sintassi quando si utilizza ripetutamente il tipo in generici?

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

avevo cercato di fare Type t = typeof(CopmanyLookupData), e utilizzare t in tutte le posizioni, ma questo non sembra funzionare.

PS: mentre sono aperto a un modo più pulito di fare esattamente ciò che viene mostrato, sono più interessato a un modo per rendere la sintassi generica più concisa in generale.

+0

Come di cambiare il nome del tipo CompanyLookupData a qualcosa di più breve. qualsiasi altra cosa, renderebbe il tuo codice meno leggibile – saj

+0

Potrei, ma non voglio rinominare le mie classi ogni volta che ho bisogno di usarle in un delegato, haha. :) –

risposta

7

Sì, ci sono alcuni modi per raggiungere questo obiettivo:

Se la variabile è una variabile locale è possibile utilizzare la parola chiave var:

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

Tuttavia, se DELCompareNonKeyFieldsCompany è una variabile di classe (un campo o una proprietà) è possibile lasciare che il compilatore dedurre alcuni di esso per voi convertendo da un gruppo di metodo per un Func:

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

Se questo tipo deve essere usato spesso, si potrebbe desiderare di creare un tipo di delegato:

public delegate bool CompareCompanyNonKeyFields(CompanyLookupData, CompanyLookupData); 

e usarlo in questo modo:

CompareCompanyNonKeyFields DELCompareNonKeyFieldsCompany = CompanyLookupData.HasIdenticalNonKeyFieldsTo; 

In alternativa, se il tipo è solo per essere utilizzato all'interno di l'una classe, si potrebbe anche creare un alias per il tipo con la parola chiave using (anche se, personalmente, trovo che questo ostacola la leggibilità del codice):

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

Invece di "campo" la tua probabilmente intendeva "proprietà"? –

+0

Grazie, mi piace la varietà :) –

0

No, non si può fare qualcosa di fondamentalmente migliore di questo. Nel bene e nel male, C# non ha l'equivalente morale di typedef.

Che cosa si potrebbe provare è un using alias per abbreviare il nome del tipo, anche se personalmente credo che questo non è una buona idea:

using CLD = CompanyLookupData; 

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

Un'altra possibilità (molto meno probabilità di essere applicabile in pratica) è quello di utilizzare una variabile implicita tipizzata (var) se si tratta di un locale.

2

È possibile utilizzare var, per s horten un po :) :)

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

L'unico modo che posso pensare è una dichiarazione di utilizzo.

using cld = MyNamespace.CompanyLookupData; 

Quindi è possibile utilizzare cld al posto del nome completo nel resto del file.

4

Prendere la dichiarazione using per dichiarare un alias:

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

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

si può nascondere in un metodo factory di supporto:

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; 
    } 
}