为了账号安全,请及时绑定邮箱和手机立即绑定

C# 如何将对象转换为运行时类型?

C# 如何将对象转换为运行时类型?

C#
慕桂英3389331 2022-12-31 13:21:03
我如何将 an 转换(或转换,如果转换不可能或不合理)object到它的运行时类型?我可以runtimeType使用反射,但不知道如何List<string>使用property.GetValue- 我知道我可以明确地做as List<String>,但这是一种软代码引擎,其中类型直到运行时才知道。任何帮助表示赞赏 - 谢谢!(但请寻找代码解决方案,而不是“你不应该这样做......”的答案)// trimmed-down example classclass Bus { public List<string> Passengers {get;set;} }// create new instance of classvar obj = new Bus();// get property value using reflectionvar listPropertyName = "Passengers";var property = GetType(obj).GetProperty($"{listPropertyName}");var runtimeType = property.PropertyType;// returns object, but I want List<string> instead // (or whatever it is; could be different types like T, List<T>, etc.)var val = property.GetValue(obj);// doesn't work (assigns null), expects compile-time typevar val = property.GetValue(obj) as runtimeType; 
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

长话短说


您不能将某些内容强制转换为运行时指定的未知类型。这意味着在您的代码中,您不知道对象的属性或方法是什么,除非您使用更多的反射。在那种情况下,铸造它的意义何在?


有时我们处理直到运行时才知道的类型。但是除非类型真的无关紧要,否则对象是无用的,除非我们可以将它转换为代码中指定的某种预定类型,而不是在运行时。


在这行代码中:


var val = property.GetValue(obj); 

的声明类型val由编译器推断。该类型是object因为这是GetValue返回的类型。对象的实际类型可以是string, int, List<Foo>, 等等。但是你有一个valtype的变量object。


如果你能这样做:


var val = property.GetValue(obj) as runtimeType;    

那么编译时类型val是什么?它怎么可能有任何值,因为它runTimeType是一个运行时值?除非您可以调用方法或检查其属性,否则该对象是无用的。但是你不能在不知道类型的情况下这样做,除非你使用更多的反射。但是,如果您打算这样做,那么施放它就没有意义了。


在您发布的代码下游的某处,您可能想要实际对涉及其方法或属性的对象执行某些操作。这意味着知道您认为它是什么类型并将其转换为该类型。那将是您的代码中指定的类型,而不是在运行时确定的类型。


例如:


var val = property.GetValue(obj); // I know this is a string

var myString = (string)val;

var findX = myString.IndexOf("X");

我认为它是一个string所以我把它作为一个string。(那里可能有额外的检查。)现在我已经转换了它,我有一个声明为 type 的变量,string我可以将它用作字符串。(除非它不是string- 然后它会抛出运行时异常。)


这就是强制转换的好处 - 它允许我们将某些内容分配给具有我们指定类型的强类型变量,然后相应地使用它。转换为未知类型对我们没有好处。


冒着增加混乱的风险:有人可能会说泛型表示运行时未指定的类型,但事实并非如此。List<T>没有指定是什么T,但是如果您List<T>以某种方式在某处创建一个 ,您将在代码中指定类型。在绝大多数正常场景中,我们必须知道一些关于对象类型的信息,否则该对象对我们来说是无用的。


查看完整回答
反对 回复 2022-12-31
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信