C#在泛型中重复使用类型时缩短语法?

时间:2012-07-11 13:01:22

标签: c# .net generics .net-3.5 delegates

如果我使用泛型,就像在这个示例中一样,有没有办法缩短语法,所以我不必重复输入“CompanyLookupData”?

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

我曾尝试Type t = typeof(CopmanyLookupData),并在所有地点使用t,但这似乎不起作用。

PS:虽然我对一个更清晰的方式做了如下所示,但我更感兴趣的是让泛型语法更简洁。

6 个答案:

答案 0 :(得分:7)

是的,有几种方法可以实现这一目标:

如果变量是局部变量,您可以使用var关键字:

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

但是,如果DELCompareNonKeyFieldsCompany是类变量(字段或属性),您可以让编译器通过从方法组转换为Func来为您推断其中的一些:

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

如果要经常使用此类型,您可能希望创建自己的委托类型:

public delegate bool CompareCompanyNonKeyFields(CompanyLookupData, CompanyLookupData);

并像这样使用它:

CompareCompanyNonKeyFields DELCompareNonKeyFieldsCompany = CompanyLookupData.HasIdenticalNonKeyFieldsTo;

或者,如果只在一个类中使用该类型,您还可以使用using关键字为该类型创建别名(尽管我个人认为这会妨碍代码的可读性) :

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

答案 1 :(得分:4)

使用using语句声明别名:

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

MyType DELCompareNonKeyFieldsCompany = new MyType(CompanyLookupData.HasIdenticalNonKeyFieldsTo);

答案 2 :(得分:3)

您可以在辅助工厂方法中隐藏它:

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

答案 3 :(得分:2)

你可以使用var来缩短一点:)

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

答案 4 :(得分:2)

我能想到的唯一方法是使用声明。

using cld = MyNamespace.CompanyLookupData;

然后你可以使用cld代替文件其余部分的全名。

答案 5 :(得分:0)

不,你不能从根本上做一些比这更好的事情。无论好坏,C#都没有道德等同于typedef

您可能会尝试使用using别名来缩短类型名称,但我个人认为这不是一个好主意:

using CLD = CompanyLookupData;

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

另一种可能性(在实践中不太可能适用)是使用隐式类型变量(var),如果我们谈论的是本地。