【发布时间】:2011-11-23 21:40:46
【问题描述】:
以下问题和答案涉及在委托中使用 out 参数:
我需要更进一步。我有几种转换方法(函数),我想在其中使用委托。例如,让我们从以下示例方法开始:
private bool ConvertToInt(string s, out int value)
{
try
{
value = Int32.Parse(s);
return true;
}
catch (Exception ex)
{
// log error
value = 0;
}
return false;
}
private bool ConvertToBool(string s, out bool value)
{
try
{
value = Convert.ToBoolean(s);
return true;
}
catch (Exception ex)
{
// log error
value = false;
}
return false;
}
然后我声明了以下委托:
delegate V ConvertFunc<T, U, V>(T input, out U output);
我想做的是这样的(伪代码):
if (do int conversion)
func = ConvertToInt;
else if (do boolean conversion)
func = ConvertToBool;
else ...
编译器只允许我显式声明委托标识符,如下所示:
ConvertFunc<string, int, bool> func1 = ConvertToInt;
ConvertFunc<string, bool, bool> func2 = ConvertToBool;
我如何声明一个标识符,我可以向它分配任何遵循上述模式的方法(基于我希望执行的转换类型)?
更新:
假设字典包含以下字符串/对象值对:
private Dictionary<string, object> dict = new Dictionary<string, object>();
带值,如:
this.dict.Add("num", 1);
this.dict.Add("bool", true);
根据答案,我能够按如下方式实现我的委托:
public T GetProperty<T>(string key)
{
ConvertFunc<string, T, bool> func = ConvertToT<T>;
object val = this.dict[key];
T result;
if (func(key, out result))
return result;
else
return default(T);
}
【问题讨论】:
-
如果没有看到会调用此委托的其余方法,很难就如何继续向您提供建议。我怀疑你会发现,当你尝试将伪代码变成真实代码时,编译器错误背后的原因变得更加清晰。
标签: c# generics delegates func