2014-03-28 75 views
5

我想将对象转换为泛型类型。下面是一个例子方法:泛型类型转换

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; 
} 

这给出了这样的错误:

Cannot implicitly convert type 'object' to 'T'. An explicit conversion exists (are you missing a cast?)

我尝试了好几种变化让我的结果转换为通用的类型,但它不是每次都工作了。

有没有办法使这个演员?

注意:在我的实际示例中,我从存储过程中获取“对象”。该方法可以调用几个存储过程中的一个,所以结果可能是一个字符串或一个int(或long),具体取决于调用哪个存储过程。

+1

你应该避免把自己在这个位置在所有可能的成本。如果您调用两个可能返回不同内容的过程,请将其中的一个包装在方法调用中,该方法调用将类型更改为所需的类型,以便在任何给定时间知道输入的* actual *类型是。 – Servy

+0

@Servy - 我这样做。有问题的方法是抽象掉数据库管道的基本抽象类的受保护方法。 Public方法有几个变体,看起来像'GetNewWidgetId()',它调用受保护的方法。 – Vaccano

+0

而不是让抽象方法返回一个对象,让它返回一个字符串或一个int;需要其中一个实现将其数据库调用的返回值更改为该方法要求它返回的内容。 – Servy

回答

10

Convert.ChangeType返回对象,所以你需要把结果回T

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

我确定OP知道,但可能需要添加注释,如果转换不可能,您应该处理异常。 – Kevin

2

试试这个:

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