gpt4 book ai didi

c# - 检查类/接口(interface)继承的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 23:55:11 25 4
gpt4 key购买 nike

下面的代码循环遍历字符串字典和 IMyCompanySettings 以查找实现 IMyCompanyProductSetting 的值。显然,尝试转换并引发异常是一种非常昂贵的方法。

    public static List<IMyCompanyProductSetting> GetProductSettings(ConfigurationManager cfm)
{
List<IMyCompanyProductSetting> ret = new List<IMyCompanyProductSetting>();
foreach(IMyCompanySetting setting in cfm.Values)
{
try
{
IMyCompanyProductSetting prod = (IMyCompanyProductSetting)setting;
ret.Add(prod);

}
catch
{
// Do nothing.
}
}
return ret;
}

执行此操作的更好方法是什么?

最佳答案

Casting 101 [有关类型转换内容的一般信息]:

使用[object] is [interface/class]表达式:

if (setting is IMyCompanyProductSetting) {
...
}

或者,您可以使用 as 关键字尝试转换对象,如果失败,它不会抛出异常,而是返回 null。注意目标类型必须是as关键字中的引用类型:

var prod = setting as IMyCompanyProductSetting; 

if (prod != null) {
...
}

您应该始终使用上述代码而不是等效的异常处理。

按类型过滤 IEnumerable (LINQy):

正如 Jon Skeet 指出的那样,您应该使用 OfType 扩展方法来轻松过滤序列(假设您有 LINQ):

var filteredSequence = sequence.OfType<TargetType>();

IEnumerable 转换为类型 (LINQy):

如果您想尝试将每个元素转换为目标类型(而不是按类型过滤),您可以使用Cast 扩展方法:

var castedSequence = sequence.Cast<TargetType>();

关于c# - 检查类/接口(interface)继承的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/711900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com