C# 泛型函数中特定于类型的行为
我有 我想为特定类型提供特定行为。我希望能做两件事中的一件。首先添加一个新函数C# 泛型函数中特定于类型的行为,c#,generics,C#,Generics,我有 我想为特定类型提供特定行为。我希望能做两件事中的一件。首先添加一个新函数 T? Get(string key) where T : struct {} 这不起作用,语法根本无效。因此,另一个选择是在函数中添加条件逻辑,如下所示: T? Get(string key) where T : DateTimeOffset {} 这不起作用,因为我最终尝试返回的不是一般意义上的t,即DateTimeOffset 我知道我可以添加一个不同的方法GetDateTimeOffset,但我正在尝试创
T? Get(string key) where T : struct {}
这不起作用,语法根本无效。因此,另一个选择是在函数中添加条件逻辑,如下所示:
T? Get(string key) where T : DateTimeOffset {}
这不起作用,因为我最终尝试返回的不是一般意义上的t,即DateTimeOffset
我知道我可以添加一个不同的方法GetDateTimeOffset
,但我正在尝试创建一个统一的接口
有什么想法吗
我知道这一定是可行的——想象一下newtonsoft(真的很棒)的JsonConvert.DeserializeObject中的代码,它必须塞满这种类型的条件代码。我想我应该去读一下代码,试试看
if(typeof(T) == typeof(DateTimeOffset))
{
return DateTimeOffset.Parse(massaged);
}
公共电话?Get(字符串键),其中T:struct
{
if(typeof(T)=typeof(DateTimeOffset))
{
var dateTimeOffset=dateTimeOffset.Parse(key);//或者你做了什么
返回日期时间偏移量为T?;
}
返回null;//等。
}
Doesreturn(T)DateTimeOffset.Parse(massaged)代码>工作?否-也不(T?)DateTimeOffset…..嗯。编译器不知道如何将DateTimeOffset
转换为任何结构,并且无法告诉它“在这种情况下,T是DateTimeOffset”。我想你可以用一些讨厌的Marshal.StructureToPtr
和Marshal.PtrToStructure
之类的东西来实现这一点。啊,也许不是:“键入'System.DateTimeOffset'不能作为非托管结构进行封送;无法计算有意义的大小或偏移量。”
public T? Get<T>(string key) where T : struct
{
if (typeof(T) == typeof(DateTimeOffset))
{
var dateTimeOffset = DateTimeOffset.Parse(key); //or what have you
return dateTimeOffset as T?;
}
return null; //etc.
}