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

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

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

不幸的是(出于简洁的原因,我不愿在这里介绍)使用dynamic作为类型参数以返回动态类型无法正常工作-我们不得不在该类中添加第二个签名返回动态响应类型:
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解决方案感兴趣,以供将来引用。

最佳答案

当某人执行Get<dynamic>时,在运行时TResourceobject。只要Get<object>不是您的用户真正想要做的事情,您就可以检查TResource是否为object来捕获两种意外情况(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/

10-12 12:43
查看更多