将返回值转换为泛型类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将返回值转换为泛型类型相关的知识,希望对你有一定的参考价值。

假设我们有一个带有单个泛型方法的接口:

public interface IExtender
{
    T GetValue<T>(string tag);
}

以及一个简单的实现A,它根据“tag”参数返回两种不同类型(B和C)的实例:

public class A : IExtender
{
    public T GetValue<T>(string tag)
    {
        if (typeof(T) == typeof(B) && tag == null)
            return (T)(object) new B();
        if (typeof(T) == typeof(C) && tag == "foo")
            return (T)(object) new C();
        return default(T);
    }
}

有可能避免双重演员(T)(object)?或者,有没有办法告诉编译器“嘿,我确信这个演员阵容不会在运行时失败,只是让我在没有首先投射到对象的情况下执行它!”

答案

或者,有没有办法告诉编译器“嘿,我确信这个演员阵容不会在运行时失败,只是让我在没有首先投射到对象的情况下执行它!”

不,这种语言是故意设计的,以防止这种情况发生。 Eric Lippert blogged about this recently。我同意这很烦人,但它确实有一定道理。

说实话,像这样的“通用”方法通常有点像设计气味。如果方法必须针对各种不同类型具有特殊情况,则至少应考虑使用单独的方法。 (GetBGetC

另一答案

检查这个样本:

    public T GetValue<T>(string tag) where T : class, new()
    {
        if (typeof(T) == typeof(B) && tag == null)
            return new T();
        if (typeof(T) == typeof(C) && tag == "foo")
            return new T();
        return default(T);
    }

不需要强制转换,你可以创建“T”的实例,只需添加说T是一个类的通用约束,它有无参数构造函数,所以你不需要创建另一个基类型,你可以确定只有合适的类型将通过这种通用方法。

另一答案
public T MyMethod<T>(string tag) where T : class
    {
        return new A() as T;
    }
另一答案

不,那是不可能的。唯一的方法是让编译器知道有关T的其他假设。正如the list of generic parameter constraints所证明的那样,C#中没有定义约束来要求特定强制转换的可用性。

另一答案

如果你让B和C实现相同的接口,你可以在你的type constraint上使用T。可能不完全是你想要的,但正如其他人所建议的那样你想要的并不是真的可能。

public interface IclassBndC {}

public class B : IclassBandC {}

public class C : IclassBandC {}

public class A : IExtender
{
    public T GetValue<T>(string tag) where T : IclassBandC 
    {
        if (tag == null)
            return new B();
        if (tag == "foo")
            return new C();
        return default(T);
    }
}
另一答案

您可以使用dynamic来存储您的实际结果,但您必须确保泛型参数类型是您返回的正确类型。

TResult GetResult<TResult>() 
{
    dynamic r = 10;
    return r;
}

以上是关于将返回值转换为泛型类型的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型“Int”的值转换为泛型中的预期参数类型“Int”

Java:将对象转换为泛型类型

在 C# 中转换为泛型类型

为什么不创建一个Object []并转换为泛型类型?解决方案是什么?

编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值

将请求参数转换为泛型类