【问题标题】:Get type using reflection使用反射获取类型
【发布时间】:2012-04-03 05:21:08
【问题描述】:

我正在尝试通过使用反射来获取我的类的属性类型,但它返回我唯一的 RuntimePropertyInfo - 作为类型的名称。

我有对象 MyObject actualData - 它包含属性 - “名称”作为字符串,“项目”作为我的类型 DatumType

我在调试时可以看到,actualData 有 2 个属性,第一个是字符串类型,第二个是 DatumType,但是当我使用这个时:

string typeName = actualData.getType().getProperty("Item").getType().Name - 它返回给我的是 RuntimePropertyInfo,而不是 DatumType

你能看出我做错了什么吗?我正在使用 C# - .Net 4.0。 非常感谢!

【问题讨论】:

  • C# 区分大小写。您在问题中包含的内容不可能是您实际尝试过的内容。
  • 你在开玩笑吗? :D 不,那肯定不是问题
  • 我没有说这是问题所在。请注意我是如何将其作为评论而不是答案包含在内的?但是,如果您不包含您实际尝试过的代码,我们只能猜测您所做的尝试是否只是固定了大小写,还是也进行了其他更改。
  • 如果大小写有任何问题,您不认为,编译器会这样告诉我吗?或者如果属性名称有问题,它会返回空异常
  • 如果你不包含你提供给编译器的代码,我怎么知道编译器告诉你什么?

标签: c# reflection types


【解决方案1】:

actualData.getType().getProperty("Item")

检索PropertyInfo 类型的内容。

如果你再询问它的类型:

actualData.getType().getProperty("Item").getType()

你得到的正是你观察到的。

我怀疑最后一个getType() 是没有必要的。

编辑:有人对这个答案投了反对票,这是不公平的恕我直言。问题是“你能看出我做错了什么吗?”成为一个getType 的答案是正确的。如果提问者知道自己做错了什么,那么在PropertyInfo 中找到PropertyType 就很容易了。

致对该答案投反对票的人:请至少在您下次投反对票时发表评论。 Stackoverflow 只有在我们相互学习时才有意义,而不仅仅是抨击周围的人。

【讨论】:

    【解决方案2】:

    您将获得 PropertyInfo 对象 getProperty() 返回的类型。试试

    string typeName = actualData.getType().getProperty("Item").PropertyType.Name;
    

    如果您想要通过PropertyInfo 对象当前分配给对象的值的类型,您可以调用:

    string typeName = actualData.getType().getProperty("Item").GetValue(actualData, null).GetType().Name;
    

    但在这种情况下,您也可以简单地调用:

    string typeName = actualData.Item.GetType().Name;
    

    【讨论】:

    • 它只返回我 - “对象”作为类型名称
    • 该属性可以定义为object,但分配有一个DatumType 值。 GetProperty 只返回定义的类型,而不是当前值的类型。任何类型都可以分配给object 类型的属性。您应该使用PropertyInfo 并在其上调用GetValue() 以获取分配值的类型。
    • 那么有什么办法可以得到这种类型吗?因为如果我在 actualData 上进行调试 - 我可以看到 Item 是 DatumType,只有反射会返回其他内容
    • 谢谢,效果很好! :) 我不能调用actualData.Item.GetType().Name,因为actualData 可以是另一个类的实例,它不包含Item 属性,所以我必须通过反射来完成,但再次感谢!
    【解决方案3】:

    GetType() 总是返回当前对象的类型,而不是指向的对象。

    在你的情况下,考虑使用string typeName = actualData.getType().getProperty("Item").PropertyType.Name

    【讨论】:

    • 不起作用。例如,如果属性是 Nullable(Of Date),则返回“Nullable`1”。仅适用于字符串属性。
    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2015-09-13
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    相关资源
    最近更新 更多