1

有没有办法object在运行时对某个特定类型进行类型转换?有可能吗?

public static void TryTypeCasting(object obj)
{
    Type type = obj.GetType();
    // Can I use this "type" variable somehow to typecast "obj" to its actual type?
}

我正在使用 C# 4.0。


编辑1:

感谢大家的投入。

我可能正在努力实现一些不可能的事情。但我发布这个问题是为了获得专家对此的看法,并了解在 C# 4.0 中是否可以实现这样的事情。

这是一个实时问题:

在我们的产品中,我们的客户端 API(方法)序列化Employee派生自我们的实体类的“某些”类(例如 )的实例Person。该序列化实例(即字符串值)通过一些中间类发送到服务器端 API(一种负责将字符串反序列化为适当类的实例的方法)。所以,在服务器端,API 得到的唯一东西就是一个字符串。

但是,在序列化时,自定义序列化程序总是添加类的完全限定名称(其实例正在被序列化)作为结果输出的第一行。所以在服务器端,在阅读第一行时,我知道Employee字符串应该被反序列化到的类(即在这种情况下)。

此外,我们调用一个接受类型参数的Web 服务方法(我不允许更改Person) 。

现在,在这个阶段反序列化之后,我有一个Employee存储在类型变量中的实例object。但即使实例可用,我也无法将它作为参数传递,直到我将其类型转换为Employee. 我怎样才能做到这一点?

此处提供了示例代码:

 public static void Deserialize(string serializedObject)
        {
            StringReader stringReader = new StringReader(serializedObject);

            // Read the first line to know class and assembly details
            string firstLine = stringReader.ReadLine();
            string[] assemblyAndClassDetails = firstLine.Split(new[] { ',' }, StringSplitOptions.None);
            string className = assemblyAndClassDetails[0];
            string assemblyName = assemblyAndClassDetails[1];

            // Remove the first line before passing it to the serializer
            serializedObject = serializedObject.Remove(0, firstLine.Length);

            // Know the type of the serialized instance
            Type typeToBeDeserializedTo = Type.GetType(className);

            DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeToBeDeserializedTo);
            using(MemoryStream memoryStream = new MemoryStream(Encoding.ASCII.GetBytes(serializedObject)))
            {
                memoryStream.Position = 0;
                object deserializedObject = dataContractJsonSerializer.ReadObject(memoryStream);

                // NOW I WANT TO call a method that accepts an argument of type `Person` How can I do this?
            }
        }
4

4 回答 4

6

不,这是完全不可能的(当然,除非特定类型在编译时已知,在这种情况下,您可以例如硬编码强制转换)。

它永远不可能是任何其他方式,因为类型转换意味着编译器完全知道结果的类型是什么。编译器怎么可能知道只能在运行时确定的东西?

每当这个问题出现时(而且它经常出现),答案是“可能有一个适合您的情况的解决方案,既不涉及这种假设类型的演员也不涉及反射”。如果您更详细地说明您的情况,我们可以建议这样的解决方案。

于 2012-10-17T12:55:52.487 回答
4

您不能在运行时执行此操作,因为您不知道对象的实际类型。此信息仅在运行时才知道,而不是在编译时。

于 2012-10-17T12:56:12.050 回答
1

假设您可以将对象分配给正确类型的变量(我不确定这是否可能),您仍然无法在方法中针对它编写任何代码,因为编译器在编译时不知道该类型是什么。

一些选择是:

  • 声明可以处理您希望接受的可能类型的方法的重载

  • 尝试转换为方法中的可能类型

    if ((var t1 = obj As type1) != null) Do something with t1

  • 使用泛型

于 2012-10-17T13:02:39.647 回答
1

正如其他人所说,这是不可能的。

但是鸭子打字呢?

((dynamic)yourObject).SomeMethod();

类型检查延迟到代码的执行。

请注意,应谨慎使用强类型语言(如 C#)中的鸭子类型,并针对特定的用例集。不要dynamic到处使用关键字来代替强类型!

于 2012-10-17T13:03:13.983 回答