如何在C#中转换为类型

时间:2011-02-10 15:50:46

标签: c# .net

任何人都可以解释如何使这个工作?我传入了类型名称,正确填充了“t”。我只是无法弄清楚如何将objectToCast转换为输入“t”。任何帮助表示赞赏。

....
Type t = Type.GetType("castToTypeNameHere");
o = CastTo<t>(objectToCast);
....

private T CastTo<T>(Object obj)
{
    return (T)obj;
}

仅供参考,这是我找到的答案:

Type t = Type.GetType(element.Attribute("castToType").Value);
MethodInfo castMethod = this.GetType().GetMethod("CastTo", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(t);
object castedObject = castMethod.Invoke(this, new object[] { objectToCast });

4 个答案:

答案 0 :(得分:7)

使用泛型(不带反射)时,类型参数必须是类型的名称,而不是System.Type的实例。所以你不能说

Type t = Type.GetType("castToTypeNameHere");
o = CastTo<t>(objectToCast);

因为t不是类型的名称。就像你说的那样

o = CastTo<typeof(int)>(objectToCast);

而不是

o = CastTo<int>(objectToCast);

前者是非法的,后者是合法的。

我不明白你想要实现的目标。如果你在编译时不知道类型,那么这样的演员是没用的。编译器不会知道o的类型,也不会获得任何编译时类型安全性和IntelliSense功能。

答案 1 :(得分:1)

您不能将变量用于泛型类型参数(例如CastTo<t>) - 它必须是实际的类型名称(e.g., CastTo<string>)。

答案 2 :(得分:0)

也许Convert.ChangeType会帮助你。

Type t = Type.GetType("castToTypeNameHere");

//using dynamic
dynamic obj = Convert.ChangeType(objectToCast, t);
obj.SomeExpectedMethod(); 

//casting to known interface
var obj = Convert.ChangeType(objectToCast, t) as IKnowWhatImSupposedToBe;
if (obj == null) HandleBadState();

答案 3 :(得分:0)

如果您认为您说的答案是:

Type t = Type.GetType(element.Attribute("castToType").Value);
MethodInfo castMethod = this.GetType().GetMethod("CastTo", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(t);
object castedObject = castMethod.Invoke(this, new object[] { objectToCast });

实际上有所作为,然后你不明白什么是铸造意味着什么。

编译时类型仍为object,因此您什么都没得到。您可以直接将任何内容直接投射到object

Casting不会改变对象的类型,它只告诉编译器你知道它是什么类型,编译器会相信你。如果你错了,错误仍然会发生,只有它在运行时使用InvalidCastException而不是编译时。

问题是,转换为在编译时不知道的类型是没有意义的。即使你可以假设,这会给你带来什么?

Type someType = Type.GetType("castToTypeNameHere");
someType o = CastTo<someType>(objectToCast);

o有哪些方法? someType可以是任何东西,因此编译器无法知道它具有哪些方法或属性,它与

完全相同

object o = (object)objectToCast

因为使用someType无法与object无法做任何事情。