我怀疑这个问题的简短答案是“否”,但我对在 C# 4.0 运行时检测动态关键字的使用的能力感兴趣,特别是作为方法的泛型类型参数。
为了提供一些背景知识,我们在许多项目之间共享的库中有一个 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 的其他程序员,我想尝试在第一种方法中检测动态的使用,以便它根本不会编译,或者在使用时抛出异常,说明一些类似的东西“如果您想要动态响应类型,请使用此其他方法”。
基本上要么:
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 解决方案感兴趣以供将来参考。