在C#中,给定一个通用类型T,我想知道如何获取类型Q,它等于非空的T,并且对于已经是可为空的T,则等于T。
这个问题源自真实的代码。我想统一访问通过查询字符串传递的参数,在我的ASP.NET应用程序中指定相同类型的默认值,但确保可以传递null作为默认值。
这个问题源自真实的代码。我想统一访问通过查询字符串传递的参数,在我的ASP.NET应用程序中指定相同类型的默认值,但确保可以传递null作为默认值。
public static T FetchValue<T>(
string name,
<T? for non-nullable, T otherwise> default_value = null) // How to write this?
{
var page = HttpContext.Current.Handler as Page;
string str = page.Request.QueryString[name];
if (str == null)
{
if (default_value == null)
{
throw new HttpRequestValidationException("A " + name + " must be specified.");
}
else
{
return default_value;
}
}
return (T)Convert.ChangeType(str, typeof(T));
}
目前我被迫使用两个重载版本的FetchValue
函数——一个没有默认值,另一个有默认值:
public static T FetchValue<T>(string name);
public static T FetchValue<T>(string name, T default_value);
这段代码运行良好,但我想知道是否有可能将两个函数合并成一个。
在C ++中,我会使用类型特征,例如具有两个专门为可为空和非可为空类型的PromoteNullable
的PromoteNullable<T>::type
。但是在C#中呢?
bool TryFetchValue<T>(string name,ref T value)
,两个重载都调用它。它完成了脏活儿,然后所有的FetchValue
方法只需要返回默认值或抛出异常(取决于它们是哪个重载)。 - Damien_The_UnbelieverTryFetchValue
- 这就是我实际实现的方式 :) - Mikhail