任何人都可以解释如何使这个工作?我传入了类型名称,正确填充了“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 });
答案 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
无法做任何事情。