我正在创建一个帮助器方法来帮助完成下面的工作.理想情况下,此方法将有一个签名以使其更容易.但似乎找不到正确的组合来使其发挥作用.

StringProp = Get<string>(item, 3);
DateProp = Get<DateTime?>(item, 4);
DateNullProp = Get<DateTime?>(item, 5);

private static T Get<T>(Row item, int index) where T : class
{
    return item[index] as T;
}

我怎么才能让它工作?它甚至支持吗?我做了一个专门的方法,但如果可以的话,我想避免它.

类限制不适用于日期,但我找不到任何组合.

是否有可能为此使用一个方法签名?

推荐答案

删除约束并使用is进行类型判断:

static T Get<T>(Row item, int index)
{
    var itemAtIndex = item[index];
    if (itemAtIndex is T val)
    {
        return val;
    }

    return default;
}

或单行:

static T Get<T>(Row item, int index) => item[index] is T val ? val : default;

注意,对于不可为空的值类型,它将返回default value(例如,DateTime返回DateTime.MinValue),如果在某些情况下不正常,可以使用方法的附加defaultVal参数来解决.

static T Get<T>(Row item, int index, T defaultValue = default) 
   => item[index] is T val 
       ? val 
       : defaultValue;

另见:

Csharp相关问答推荐

如何使用FastEndpoints和.NET 8 WebAppliationBuilder进行集成测试?

迭代C#List并在数据库中 for each 元素执行SELECT语句—更有效的方式?

无法解析数据库上下文的服务

如何从HttpContext获取请求正文

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

如何在不考虑年份的情况下判断日期时间是否在某个日期范围内?

如何使用NumberFormatInfo

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

Blazor Web App WASM的两个独立项目令人困惑

DbContext-传递自定义配置选项

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

为什么我可以用硬编码的集合而不是变量来设置没有setter的IList属性的值?

自定义列表按字符串的部分排序

在C#.NET项目中启动时,如何等待提升的PowerShell进程退出?

如何在.NET Maui中将事件与MVVM一起使用?

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

C#中COM对象的实际地址

在Unity C#中按键点击错误的参数

.NET8支持Vector512,但为什么向量不能达到512位?

这是T自身的布尔表达式是什么意思?