Yes*_*ke. 4 .net c# reflection inheritance
下面的代码循环遍历字符串字典和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;
}
Run Code Online (Sandbox Code Playgroud)
有什么更好的方法呢?
Meh*_*ari 14
使用[object] is [interface/class]表达式:
if (setting is IMyCompanyProductSetting) {
...
}
Run Code Online (Sandbox Code Playgroud)
或者,你可以使用as试图转换对象的关键字,如果它失败,它将返回而不是抛出异常null.请注意,目标类型必须是as关键字中的引用类型:
var prod = setting as IMyCompanyProductSetting;
if (prod != null) {
...
}
Run Code Online (Sandbox Code Playgroud)
您应该始终使用上面的代码而不是等效的异常处理.
IEnumerable类型(LINQy):正如Jon Skeet指出的那样,您应该使用OfType扩展方法轻松过滤序列(假设您有LINQ):
var filteredSequence = sequence.OfType<TargetType>();
Run Code Online (Sandbox Code Playgroud)
IEnumerable为类型(LINQy):如果要尝试将每个元素转换为目标类型(而不是按类型过滤),则可以使用Cast扩展方法:
var castedSequence = sequence.Cast<TargetType>();
Run Code Online (Sandbox Code Playgroud)
"硬"方式(LINQ之前)是使用"as".这比使用"is"然后每次转换(因为"是"和转换需要执行时间检查)更有效:
IMyCompanyProductSetting prod = setting as IMyCompanyProductSetting;
if (prod != null)
{
ret.Add(prod);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用的是.NET 3.5,则非常简单:
return cfm.Values.OfType<IMyCompanyProductSetting>().ToList();
Run Code Online (Sandbox Code Playgroud)
很容易 :)
| 归档时间: |
|
| 查看次数: |
3848 次 |
| 最近记录: |