9

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

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

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

PS:虽然我愿意以一种更简洁的方式来做所显示的事情,但我对一种使泛型语法更简洁的方法更感兴趣。

4

6 回答 6

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;
于 2012-07-11T13:03:24.550 回答
4

using声明别名的语句:

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

MyType DELCompareNonKeyFieldsCompany = new MyType(CompanyLookupData.HasIdenticalNonKeyFieldsTo);
于 2012-07-11T13:06:24.907 回答
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;
    }
}
于 2012-07-11T13:07:47.843 回答
2

您可以使用 var,缩短一点 :)

var DELCompareNonKeyFieldsCompany = new Func<CompanyLookupData, CompanyLookupData, bool>(CompanyLookupData.HasIdenticalNonKeyFieldsTo); 
于 2012-07-11T13:03:45.020 回答
2

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

using cld = MyNamespace.CompanyLookupData;

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

于 2012-07-11T13:03:45.093 回答
0

不,你不能从根本上做比这更好的事情。无论好坏,C# 都没有typedef.

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

using CLD = CompanyLookupData;

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

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

于 2012-07-11T13:03:15.220 回答