【问题标题】:Generic Type Conversions泛型类型转换
【发布时间】:2014-03-28 18:22:04
【问题描述】:

我正在尝试将对象转换为泛型类型。这是一个示例方法:

void Main()
{
    object something = 4;
    Console.WriteLine(SomeMethod<int>(something));
    Console.WriteLine(SomeMethod<string>(something));
}

public T SomeMethod<T>(object someRandomThing)
{

    T result = Convert.ChangeType(someRandomThing, typeof(T));

    return result;
}

这给出了这个错误:

无法将类型“object”隐式转换为“T”。存在显式转换(您是否缺少演员表?)

我已经尝试了几种变体来将我的结果转换为泛型类型,但并不是每次都能奏效。

有没有办法制作这个演员表?

注意:在我的真实示例中,我从存储过程中获取了一个“对象”。该方法可以调用多个存储过程之一,因此结果可以是字符串或 int(或 long),具体取决于调用的 sproc。

【问题讨论】:

  • 您应该不惜一切代价避免将自己置于这个位置。如果您正在调用两个可能返回不同内容的过程,请将其中一个包装在一个方法调用中,将类型更改为您想要的类型,以便在任何给定时间您都知道 实际 你输入的类型是。
  • @Servy - 我就是这么做的。有问题的方法是基本抽象类的受保护方法,用于抽象出数据库管道。 Public 方法是几个看起来像 GetNewWidgetId() 的变体,它调用受保护的方法。
  • 与其让抽象方法返回一个对象,不如让它返回一个字符串或一个int;要求其中一种实现将其 DB 调用的返回值更改为方法要求它返回的值。

标签: c# .net casting


【解决方案1】:

Convert.ChangeType 返回对象,因此您需要将结果转换回 T

T result = (T)Convert.ChangeType(someRandomThing, typeof(T))

【讨论】:

  • 我确信 OP 知道,但可能想添加一条说明,如果无法进行转换,您应该处理异常。
【解决方案2】:

试试这个:

return (T)Convert.ChangeType(someRandomThing, typeof(T));

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多