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

Posted

技术标签:

【中文标题】C# 在泛型中重复使用类型时缩短语法?【英文标题】:C# Shorten syntax when repeatedly using type in generics? 【发布时间】:2012-07-11 02:32:42 【问题描述】:

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

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

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

PS:虽然我愿意以一种更简洁的方式来完成所展示的内容,但我更感兴趣的是一种使泛型语法总体上更简洁的方法。

【问题讨论】:

如何将 CompanyLookupData 类型的名称更改为更短的名称。其他任何东西,都会降低您的代码的可读性 我可以,但我不想每次需要在委托中使用它们时都重命名我的类,哈哈。 :) 【参考方案1】:

是的,有几种方法可以实现:

如果变量是局部变量,您可以使用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;

【讨论】:

您可能指的是“财产”而不是“字段”?【参考方案2】:

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

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】:

using 语句声明别名:

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

MyType DELCompareNonKeyFieldsCompany = new MyType(CompanyLookupData.HasIdenticalNonKeyFieldsTo);

【讨论】:

【参考方案4】:

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

using cld = MyNamespace.CompanyLookupData;

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

using CLD = CompanyLookupData;

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

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

【讨论】:

以上是关于C# 在泛型中重复使用类型时缩短语法?的主要内容,如果未能解决你的问题,请参考以下文章

多类型参数约束的C#泛型语法[重复]

Java泛型中通配符的使用

Java泛型中的“超级”和“扩展”有啥区别[重复]

C#学习笔记8

unity的C#学习——泛型的创建与继承泛型集合类泛型中的约束和反射

在C#中将类型参数传递给泛型[重复]