【发布时间】:2014-02-23 08:12:01
【问题描述】:
我想将类名和方法名动态传递给方法并保持动态,我知道我应该使用泛型和可能的约束。
例如,我有一堂课
MemberRequestDTO (contains several properties)
我还说一个方法叫
RecordsToRetrieve
使用一些反射,我想动态获取属性的值,我想出了如何做到这一点,但后来我意识到这是太难的代码并且紧密耦合,我想是时候重构并创建一个具有使用带有约束的泛型的签名的方法。在理解使用和约束等方面有困难。
所以我想传入一个类名并能够在方法中使用它,通过反射我打算像这样使用它:
Type type = typeof(classname);
我开始阅读和研究,并开始使用这样的代码:
public void GetTypeValues<T>() where T : class , new()
- 如何传入 MemberRequestDTO 的类名?
- Generic 对我有什么新作用?
- 如何将类名传递到括号 () 中?
- 如果我使用它是否也会传递到括号中?
- 如何传入类和方法?
- 阅读上面的“哪里 T 有约束(强制)为“类 AND new()”类型?
对此有点迷茫和困惑,请见谅。
编辑:
根据答案和一些研究,我对此有了更多的理解:
让我们忘记我试图传递一个方法,说我只想传递一个类
说有属性的类是这样的
public class MemberRequestDTO
{
public DateTime DateRequested { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
那我就更新一下
var memberRequestDTO = new MemberRequestDTO();
然后我想把这个传递给类,变成一个通用的方法
如何将对象的实例传递给泛型方法?那么签名呢,例如 public void GetTypeValues() where T : class , new()
我想拥有 class 和 new() 的约束吗?
对于上述情况,T 是类的实例吗?因此目的是我可以成为
说
GetTypeValues(memberRequestDTO)
(这是我的实际问题,传入我实例化的任何类,让方法“处理”处理该类,循环遍历属性并动态获取属性的名称值是的,它可能不会是一个 void 方法)
传入memberRequestDTO 应该带引号还是不带引号?我希望能够将类的任何实例传递给成员,然后对其进行更多操作。 () 应该在那里吗? parens () 应该为空还是包含类对象的通用参数?
【问题讨论】:
标签: c# generics constraints