C# 如何在C中转换为类型

C# 如何在C中转换为类型,c#,.net,C#,.net,有人能解释一下如何让它工作吗?我正在传入类型名,并且t被正确填充。我就是不知道如何将objectToCast转换为t类型。感谢您的帮助 .... Type t = Type.GetType("castToTypeNameHere"); o = CastTo<t>(objectToCast); .... private T CastTo<T>(Object obj) { return (T)obj; } 当使用无反射的泛型时,类型参数必须是类型的名称,而不是Sy

有人能解释一下如何让它工作吗?我正在传入类型名,并且t被正确填充。我就是不知道如何将objectToCast转换为t类型。感谢您的帮助

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

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

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

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

o = CastTo<int>(objectToCast);
前者是非法的,后者是合法的


我不明白你想达到什么目的。如果您在编译时不知道类型,那么这样的强制转换是无用的。编译器将不知道o的类型,您也不会获得任何编译时类型安全或IntelliSense功能。

当您在没有反射的情况下使用泛型时,类型参数必须是类型的名称,而不是System.type的实例。所以你不能说

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

o = CastTo<int>(objectToCast);
前者是非法的,后者是合法的


我不明白你想达到什么目的。如果您在编译时不知道类型,那么这样的强制转换是无用的。编译器不知道o的类型,您也不会获得任何编译时类型安全或IntelliSense功能。

您不能将变量用于泛型类型参数,例如CastTo。它必须是实际的类型名称,例如CastTo

不能将变量用于泛型类型参数,例如CastTo,它必须是实际的类型名称,例如CastTo

也许能帮到你

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();
也许我能帮你

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();

如果你认为你找到的答案是:

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,因此您什么也得不到。您可以直接将任何对象直接转换为对象

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

问题是,转换到编译时不知道的类型是没有意义的。即使你可以假设,那会给你什么

Type someType = Type.GetType("castToTypeNameHere");
someType o = CastTo<someType>(objectToCast);
o有什么方法?someType可以是任何类型,因此编译器无法知道它有什么方法或属性,它与

对象o=objectobjectToCast


因为对于某种类型,你无法用object做任何事情。

如果你认为你所说的答案是:

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,因此您什么也得不到。您可以直接将任何对象直接转换为对象

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

问题是,转换到编译时不知道的类型是没有意义的。即使你可以假设,那会给你什么

Type someType = Type.GetType("castToTypeNameHere");
someType o = CastTo<someType>(objectToCast);
o有什么方法?someType可以是任何类型,因此编译器无法知道它有什么方法或属性,它与

对象o=objectobjectToCast


因为对于某种类型,你无法用object做任何事情。

你能解释一下为什么要用o=CastToobj;当你可以用o=tobj;请?@Kieren:在给出的示例中不能使用CastToobj或tobj,因为t是一个类型实例,而不是一个类型名。@Kieren,两种方法都不能使用tobj;你能解释一下你为什么要做o=CastToobj;当你可以用o=tobj;请?@Kieren:在给出的示例中不能使用CastToobj或tobj,因为t是一个类型实例,而不是一个类型名。@Kieren,两种方法都不能使用tobj;也不是卡斯托,这就是问题所在。