2012-07-11 5 views
9

Wenn ich Generics verwende, wie in diesem Beispiel, gibt es eine Möglichkeit, die Syntax zu verkürzen, damit ich nicht wiederholt "CompanyLookupData" eingeben muss?C# Syntax abkürzen, wenn wiederholt Generics eingegeben werden?

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

hatte ich versucht Type t = typeof(CopmanyLookupData), zu tun und t in allen Standorten verwenden, aber das scheint nicht zu funktionieren.

PS: Während ich offen für eine sauberere Art und Weise bin, genau das zu tun, was gezeigt wird, interessiere ich mich mehr für eine Möglichkeit, generische Syntax im Allgemeinen prägnanter zu machen.

+0

Wie wäre es kürzer den Namen des CompanyLookupData Typ etwas zu ändern. alles andere, würde Ihren Code weniger lesbar machen – saj

+0

Ich könnte, aber ich möchte nicht meine Klassen jedes Mal umbenennen, wenn ich sie in einem Delegierten verwenden muss, haha. :) –

Antwort

7

Ja, es gibt ein paar Möglichkeiten, dies zu erreichen:

Wenn die Variable eine lokale Variable ist, können Sie das var Schlüsselwort:

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

Wenn jedoch DELCompareNonKeyFieldsCompany ist eine Klassenvariable (a Feld oder eine Eigenschaft), die Sie den Compiler aus einer Methodengruppe Umwandlung einige davon für Sie zu einem Func ableiten lassen können:

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

Wenn diese Art häufig verwendet werden soll, können Sie Ihren eigenen Delegattyp zu erstellen:

public delegate bool CompareCompanyNonKeyFields(CompanyLookupData, CompanyLookupData); 

Und wie so verwenden:

CompareCompanyNonKeyFields DELCompareNonKeyFieldsCompany = CompanyLookupData.HasIdenticalNonKeyFieldsTo; 

Alternativ, wenn der Typ nur dann verwendet werden soll, innerhalb

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

Anstelle von "field" meinst du wahrscheinlich "Eigentum"? –

+0

Danke, ich mag die Sorte :) –

0

Nein, etwas grundsätzlich Besseres kann man nicht machen. Zum besseren oder zum schlechteren hat C# nicht das moralische Äquivalent von typedef.

Was Sie könnten versuchen, ist ein using alias die Typnamen zu verkürzen, obwohl ich persönlich glaube, dass dies keine gute Idee ist:

using CLD = CompanyLookupData; 

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

Eine weitere Möglichkeit (weit weniger wahrscheinlich, dass in der Praxis anwendbar sein) ist zu Verwenden Sie eine implizit typisierte Variable (var), wenn wir von einem lokalen sprechen.

2

Sie können var verwenden, um s: die eine Klasse, man könnte auch ein Alias ​​für den Typ mit dem using Schlüsselwort (obwohl ich persönlich finde, dass dies erschwert die Lesbarkeit des Codes) erstellen horten ein wenig :)

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

Der einzige Weg, an den ich denken kann, ist eine Verwendungserklärung.

Dann können Sie Cld anstelle des vollständigen Namens im Rest der Datei verwenden.

4

Nehmen Sie die using Anweisung einen Aliasnamen zu deklarieren:

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

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

Sie es in einem Helfer Factory-Methode verstecken:

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