如何在C#中将属性类型传递给T?

如何在C#中将属性类型传递给T?,c#,generics,dynamic,types,C#,Generics,Dynamic,Types,嗯 这就是我正在做的,我有一个叫做设置的类 “设置”有一个属性列表: 我正在努力使它尽可能动态。 所以我可以复制粘贴每个属性,然后更改其名称 它将通过名称获取新设置 例如 public string Url { get { return Get<string>(MethodBase.GetCurrentMethod()); } } public int Port { get { return Get<int>(MethodBase.GetCurrentMethod());

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

我正在努力使它尽可能动态。
所以我可以复制粘贴每个属性,然后更改其名称 它将通过名称获取新设置

例如

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
}
公共字符串Url
{get{返回get(MethodBase.GetCurrentMethod());}
公共int端口
{get{返回get(MethodBase.GetCurrentMethod());}
私有T Get(MethodBase方法)
{
//从属性名称中提取设置的代码
}
问题是,如何传递要获取的属性类型,这样我就不必两次指定数据类型

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

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

无法推断退货类型;您不能使用泛型来实现这一点

如果
Get
没有使用
typeof(t)
,您可以将其更改为返回
动态
,而不是使用泛型。 然后调用方可以在其
return
语句中隐式强制转换结果


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

您不能执行类似的操作

Get<MethodThatReturnsAType()>
Get
因为泛型类型是在编译时设置的。我有点想知道你在这里有什么优势。您可以使用Get simply return对象并在属性中管理强制转换


例如,如果设置丢失,或者定义了错误的类型,您希望看到什么行为

在中,但在C#中,您似乎不能:(这非常有效,如果会有性能损失,怀疑它是否会非常明显,一旦我完成了负载测试,就会运行负载测试,看看它在多大程度上不会回答这个问题-但我会强烈地重新考虑这种方法。不仅代码几乎毫无意义地混淆(与
Get(“Port”)相比)
例如),但是由于反射,性能会很差,在将来的重构过程中重命名属性可能会破坏代码,因为人们可能没有意识到属性名称被有效地用作字典键(请参阅前面关于混淆的评论)。我这样做的主要原因是集中获取设置的位置,而不是让代码遍布整个项目。如果我决定更改读取设置的位置,这不是一个噩梦,我使用反射只是获取属性名称。我需要这样做的原因是,我可以通过复制粘贴以前的设置来创建设置只需更改它的名称和数据类型,我实际上在db中有我的设置,所以它通过属性名从db中获取设置