小编典典

使用类型变量转换变量

c#

我可以在C#中将类型为object的变量转换为类型T的变量,其中T是在类型变量中定义的吗?


阅读 281

收藏
2020-05-19

共1个答案

小编典典

这是强制转换和转换的示例:

using System;

public T CastObject<T>(object input) {   
    return (T) input;   
}

public T ConvertObject<T>(object input) {
    return (T) Convert.ChangeType(input, typeof(T));
}

编辑:

评论中的一些人说,这个答案不能回答问题。但是生产线(T) Convert.ChangeType(input, typeof(T))提供了解决方案。该Convert.ChangeType方法尝试将任何Object转换为第二个参数提供的Type。

例如:

Type intType = typeof(Int32);
object value1 = 1000.1;

// Variable value2 is now an int with a value of 1000, the compiler 
// knows the exact type, it is safe to use and you will have autocomplete
int value2 = Convert.ChangeType(value1, intType);

// Variable value3 is now an int with a value of 1000, the compiler
// doesn't know the exact type so it will allow you to call any
// property or method on it, but will crash if it doesn't exist
dynamic value3 = Convert.ChangeType(value1, intType);

我已经用泛型写了答案,因为我想当您不处理实际类型而将其强制a something转换为代码时,很可能是代码气味的迹象a something else。使用适当的接口,在99.9%的时间中不必要。在反思中也许有一些边缘情况可能是有意义的,但我建议避免这些情况。

编辑2:

一些额外的技巧:

  • 尽量使代码保持类型安全。如果编译器不知道类型,那么它将无法检查代码是否正确,并且自动完成之类的功能将无法正常工作。简而言之: 如果您在编译时无法预测类型,那么编译器将如何
  • 如果要使用的类实现了公共接口,则可以将值强制转换为该接口。否则,请考虑创建自己的接口并让类实现该接口。
  • 如果您正在使用要动态导入的外部库,则还要检查一个公共接口。否则,请考虑创建实现该接口的小型包装器类。
  • 如果要在对象上进行调用,但不关心类型,则将值存储在objectdynamic变量中。
  • 泛型可能是创建适用于许多不同类型的可重用代码的好方法,而不必知道所涉及的确切类型。
  • 如果您陷入困境,请考虑使用其他方法或代码重构。您的代码真的必须具有动态性吗?是否必须考虑任何类型?
2020-05-19