如何转换为给定类型

本文关键字:类型 转换 何转换 | 更新日期: 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,因此您仍然可以动态使用它的方法和属性。