如何转换为给定类型
本文关键字:类型 转换 何转换 | 更新日期: 2023-09-27 18:31:29
我试图弄清楚如何做一些事情
Type t = Type.GetType("fully qualified type name");
dynamic obj = foo as t
我该怎么做? 我正在查看Convert.ChangeType()
,但这只返回一个对象,这不是我想要的。
看来你在混合学科,我不明白为什么。 要么使用反射,要么使用动态类型,但同时使用两者对我来说毫无意义。
如果要对控件的类型执行某些操作,请让它们实现一个接口:
interface IModule
{
string Name { get; }
}
class Module1 : IModule
{
public string Name { get { return "Module 1"; } }
}
public void PrintModuleName(string moduleType)
{
Type tModule = Type.GetType("MyApp.Module1");
IModule module = (IModule)Activator.CreateInstance(tModule);
Console.WriteLine(module.Name);
}
如果您正在使用无法控制的类型,请使用 dynamic
- 无需强制转换:
class Module1
{
public string Name { get { return "Module 1"; } }
}
public void PrintModuleName(string moduleType)
{
Type tModule = Type.GetType("MyApp.Module1");
dynamic module = Activator.CreateInstance(tModule);
Console.WriteLine(module.Name);
}
我可以看到强制转换是必需的唯一情况是 COM 互操作作为QueryInterface
的替代品,或者如果类型实现返回新对象的强制转换。
<小时 />关于您的评论:
由于
Convert.ChangeType()
返回一种对象类型,因此obj
不会仍然 在运行时解析为某种类型的对象?这与object obj = Convert.ChangeType(foo,t);
?据我了解,dynamic
关键字仍使用相同的类型
静态类型指定允许在代码中访问的最受限制的类型。 例如,您有一个变量t
语句 Type t = Type.GetType("foo");
中键入为 System.Type
,但在运行时,GetType
将返回 System.RuntimeType
类型的值。 由于System.RuntimeType
继承自System.Type
,所以不是问题。
同样,所有内容* 继承自 System.Object
,并且可以存储在类型为 object
的变量中。 一个例子可能会有所帮助:
System.Type t = Type.GetType("System.String");
Console.WriteLine("Runtime type of `t`:'t{0}", t.GetType().FullName);
// Prints "Runtime type of `t` is: System.RuntimeType"
System.String s = "foo";
Console.WriteLine("Runtime type of `s`:'t{0}", s.GetType().FullName);
// Prints "Runtime type of `s` is: System.String"
object o = s;
Console.WriteLine("Runtime type of `o`:'t{0}", o.GetType().FullName);
// Prints "Runtime type of `o` is: System.String"
动态是反射的语法糖,因此不作为单独的类型存在。 所以:
string s = "foo";
Console.WriteLine("Runtime type of `s`:'t{0}", s.GetType().FullName);
// Prints "Runtime type of `s` is: System.String"
dynamic d = s;
Console.WriteLine("Runtime type of `d:'t{0}", d.GetType().FullName);
// Also prints "Runtime type of `d` is: System.String"
与以下相同:
string s = "foo";
Console.WriteLine("Runtime type of `s`:'t{0}", s.GetType().FullName);
Type typeOfS = s.GetType();
object resultOfGetType = typeOfS.GetMethod("GetType").Invoke(s, null);
Type typeOfResultOfGetType = resultOfGetType.GetType();
object resultOfFullName = typeOfResultOfGetType.GetProperty("FullName").GetValue(resultOfGetType);
Console.WriteLine("Runtime type of `d:'t{0}", resultOfFullName);
C# 只是在编译时生成所有这些代码**。
*:井。。。几乎所有东西
**:井。。。不完全是这个代码
使用as
,因为它要求在编译时知道类型。 既然您已经在使用dynamic
为什么不直接执行以下操作:
dynamic obj = Convert.ChangeType(foo, t);
Convert.ChangeType
方法的返回类型是object
,但基础对象的实际类型将是t
,因此您仍然可以动态使用它的方法和属性。