【问题标题】:How to get property type passed to T in C#?如何在 C# 中获取传递给 T 的属性类型?
【发布时间】:2011-06-22 08:54:57
【问题描述】:

好的,

这就是我正在做的,我有一个名为“设置”的类
Settings 有一个属性列表:

我正在尝试使其尽可能动态。
所以我可以复制并粘贴每个属性并更改其名称 它会按名称获取新设置

例子..

public string Url
{ get { return Get<string>(MethodBase.GetCurrentMethod()); } }
public int Port
{ get { return Get<int>(MethodBase.GetCurrentMethod()); } }

private T Get<T>(MethodBase method)
{
  // Code that pulls setting from the property name
}

问题是,如何将属性类型传递给 Get,这样我就不必指定两次数据类型了..

我知道这是错误的,但有点像

Get<MethodBase.GetCurrentMethod().GetType()>(MethodBase.GetCurrentMethod());

【问题讨论】:

  • 不是这个问题的答案 - 但我会强烈重新考虑这种方法。不仅代码几乎被无缘无故地混淆了(例如与Get&lt;int&gt;("Port") 相比),而且由于反射,性能会很差,并且在未来重构期间重命名属性可能会破坏您的代码,因为人们可能没有意识到属性名称被有效地使用字典键(参见之前关于混淆的 cmets)。
  • 我这样做的主要原因是集中我获取设置的位置,而不是在整个项目中使用代码,如果我决定更改从哪里读取设置,它是这不是一场噩梦,我使用反射只是获取属性名称

标签: c# generics dynamic types


【解决方案1】:

你不能这样做

Get<MethodThatReturnsAType()>

因为泛型类型是在编译时设置的。我有点想知道你在这里获得的优势是什么。您可以让 Get 简单地返回对象并管理属性中的转换。

如果设置缺失,或者定义了错误的类型,你会期待什么行为?

【讨论】:

  • 我需要这个的原因是我可以通过复制粘贴以前的设置来创建设置,只需更改其名称和数据类型,我实际上在 db 中有我的设置,所以它通过属性名称从 db 中获取设置
【解决方案2】:

无法推断返回类型;你不能使用泛型来做到这一点。

如果Get 不使用typeof(T),您可以将其更改为返回dynamic 而不是使用泛型。 然后,调用者可以在其return 语句中隐式转换结果。

不过,可能会有性能损失。

【讨论】:

  • C++ you can do this,但似乎在C#中你不能:(
  • 这很好,如果会有性能损失,怀疑它会非常明显,一旦我完成运行负载测试,看看它会是多少
猜你喜欢
  • 1970-01-01
  • 2019-09-30
  • 2021-09-02
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多