通用类型转换

6

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

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”。存在显式转换(是否漏掉了一个强制类型转换?)

我已经尝试了几种方法,将我的结果转换为一般类型,但每次都没有成功。

有办法进行转换吗?

注意:在我的实际示例中,我从存储过程中获取了一个“object”。该方法可以调用多个存储过程,因此根据调用的sproc,结果可以是字符串或int(或long)。


1
你应该尽可能避免陷入这种境地。如果你正在调用两个可能返回不同结果的过程,请将其中一个包装在一个方法调用中,将其类型更改为所需类型,以便在任何时候都知道你输入的实际类型是什么。 - Servy
@Servy - 我这样做了。所讨论的方法是一个基本抽象类的受保护方法,用于抽象数据库管道。公共方法有几个变体,看起来像 GetNewWidgetId(),它调用受保护的方法。 - Vaccano
不要让抽象方法返回一个对象,而是让它返回一个字符串或整数;要求其中一个实现将其DB调用的返回值更改为方法所需的返回值。 - Servy
2个回答

12

Convert.ChangeType 方法返回的是对象,因此您需要将结果强制转换回 T 类型。

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

1
我相信原帖作者已经知道了,但可能需要添加一条注释以说明在转换不可行的情况下应该处理异常。 - Kevin

3

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接