gpt4 book ai didi

c# - 在运行时检测使用 "dynamic"关键字作为类型参数

转载 作者:太空狗 更新时间:2023-10-29 20:33:54 26 4
gpt4 key购买 nike

我怀疑这个问题的简短答案是“否”,但我对在 C# 4.0 中检测运行时 dynamic 关键字的使用的能力很感兴趣,特别是作为方法的泛型类型参数。

为了提供一些背景知识,我们在多个项目共享的库中有一个 RestClient 类,它采用类型参数来指定反序列化响应时应使用的类型,例如:

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers)
where TResource : new()
{
var request = this.GetRequest(uri, headers);
return request.GetResponse<TResource>();
}

不幸的是(由于一些原因,为了简洁起见我不会在这里深入)使用动态作为类型参数以返回动态类型不能正常工作——我们不得不添加第二个签名返回动态响应类型的类:

public IRestResponse<dynamic> Get(Uri uri, IDictionary<string, string> headers)
{
var request = this.GetRequest(uri, headers);
return request.GetResponse();
}

但是,使用 dynamic 作为第一个方法的类型参数会导致一个非常奇怪的错误,它掩盖了实际问题并使调试整个事情变得很头疼。为了帮助其他使用 API 的程序员,我想尝试检测第一种方法中 dynamic 的使用,这样它要么根本无法编译,要么在使用时抛出异常“如果您想要动态响应类型,请使用其他方法”。

基本上是:

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers)
where TResource is not dynamic

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers)
where TResource : new()
{
if (typeof(TResource).isDynamic())
{
throw new Exception();
}

var request = this.GetRequest(uri, headers);

return request.GetResponse<TResource>();
}

这两种情况都有可能吗?我们正在使用 VS2010 和 .Net 4.0,但如果可以使用更新的语言功能,我会对 .Net 4.5 解决方案感兴趣以供将来引用。

最佳答案

当有人做 Get<dynamic> , 在运行时 TResourceobject .只要Get<object>这不是您的用户真正想要做的事情,您可以检查是否 TResourceobject捕获两种意外情况( objectdynamic )。

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers)
where TResource : new()
{
if (typeof(TResource) == typeof(object))
{
throw new Exception("Use the dynamic one");
}

var request = this.GetRequest(uri, headers);

return request.GetResponse<TResource>();
}

关于c# - 在运行时检测使用 "dynamic"关键字作为类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19180255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com