2012-07-11 9 views
9

Jeśli używam generycznych, jak w tym przykładowym przypadku, czy istnieje sposób na skrócenie składni, więc nie muszę wielokrotnie wpisywać "CompanyLookupData"?C# Skróć składnię, gdy wielokrotnie używasz typów ogólnych?

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

próbowałem zrobić Type t = typeof(CopmanyLookupData) i używać t we wszystkich miejscach, ale to nie wydaje się działać.

PS: podczas gdy jestem otwarty na czystszy sposób robienia dokładnie tego, co pokazano, bardziej interesuje mnie sposób, aby ogólnie składnia generyczna była bardziej zwięzła.

+0

Jak o zmianę nazwy z CompanyLookupData Type coś krótszego. cokolwiek innego, sprawiłoby, że twój kod byłby mniej czytelny. – saj

+0

Mogłem, ale nie chcę zmieniać nazw moich zajęć za każdym razem, gdy potrzebuję ich użyć w delegacie, haha. :) –

Odpowiedz

7

Tak, istnieje kilka sposobów na osiągnięcie tego:

Jeśli zmienna jest zmienną lokalną można użyć var kluczowe:

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

Jednak jeśli DELCompareNonKeyFieldsCompany jest zmienną klasy (a pole lub właściwość) można pozwolić kompilator wywnioskować, niektóre z nich dla ciebie poprzez konwersję z grupy metody do Func:

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

Jeśli tego typu ma być stosowany częściej, może chcesz stworzyć swój własny rodzaj Delegat:

public delegate bool CompareCompanyNonKeyFields(CompanyLookupData, CompanyLookupData); 

i używać go tak:

CompareCompanyNonKeyFields DELCompareNonKeyFieldsCompany = CompanyLookupData.HasIdenticalNonKeyFieldsTo; 

Alternatywnie, jeśli typ jest tylko do użytku wewnątrz jedna klasa, można także utworzyć alias do typu z kluczowych using (choć osobiście uważam, że to utrudnia czytelność kodu):

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

Zamiast "pola" twój prawdopodobnie oznaczał "własność"? –

+0

Dziękuję, lubię różnorodność :) –

0

Nie, nie można zrobić czegoś zasadniczo lepszego niż to. Na dobre i na złe, C# nie ma moralnego odpowiednika typedef.

Co można spróbować JEST using alias skrócić nazwę typu, chociaż osobiście wierzę, że to nie jest dobry pomysł:

using CLD = CompanyLookupData; 

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

Inna możliwość (o wiele mniej prawdopodobne, aby być stosowane w praktyce) jest użyj niejawnie wpisanej zmiennej (var), jeśli mówimy o lokalizacji lokalnej.

2

można użyć var ​​do s horten trochę :)

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

Jedyny sposób, jaki mogę wymyślić to deklaracja użycia.

using cld = MyNamespace.CompanyLookupData; 

Następnie można użyć nazwy cld zamiast pełnej nazwy w pozostałej części pliku.

4

Take oświadczenie using zadeklarować alias:

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

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

Można ukryć go w metodzie fabrycznego pomocnik:

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; 
    } 
} 
Powiązane problemy