- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想动态地将一个类名和一个方法名传递给一个方法并保持动态,我知道我应该使用泛型和可能的约束。
例子,我有一个类
MemberRequestDTO (contains several properties)
我还有一个方法叫做
RecordsToRetrieve
使用一些反射我想动态获取属性的值,我想出了如何做到这一点,但后来我意识到这是太难的代码并且紧密耦合,我想时间重构并创建一个带有使用带有约束的泛型的签名的方法。在理解使用和约束等方面遇到困难。
所以我想传入一个类名并能够在方法中使用它,通过反射我打算像这样使用它:
类型 type = typeof(classname);
我开始阅读和研究,并开始使用这样的代码:
public void GetTypeValues<T>() where T : class , 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)
(这是我的实际问题,传递到我实例化的任何类,让方法“处理”处理该类,循环遍历属性并动态获取属性的名称值是的,它可能不会保持无效方法)
传入 memberRequestDTO 应该带引号还是不带引号?我希望能够将类的任何实例传递给成员,然后对其进行更多操作。 () T 应该在那里吗? parens () 应该为空还是包含类对象的通用参数?
最佳答案
这是你的答案:
GetTypeValues<MemberRequestDTO>()
new()
是 Type Parameter - T
的约束.它说类型参数 T
必须有一个公共(public)的无参数构造函数。在你的情况下,MemberRequestDTO
类必须是如下所示的公共(public)无参数构造函数:
public class MemberRequestDTO
{
public MemberRequestDTO() { ... }
}
类名是reference type
,您可以将其作为 type
传递像这样进入 parent :SomeMethod(typeof(MemberRequestDTO));
其中方法的签名是 void SomeMethod(Type type) { }
如果您将类(class)作为 type parameter
传递与第 (1) 点一样,它不会传递到 parens()
class
约束意味着“类型参数必须是引用类型;这也适用于任何类、接口(interface)、委托(delegate)或数组类型。”和 new()
约束意味着“类型参数必须具有公共(public)无参数构造函数。当与其他约束一起使用时,必须最后指定 new() 约束。”
如果我明白你的意思,那么泛型方法定义将类似于:
public void GetTypeValues<T>(T typeObject) where T : class
{
// typeObject specific operations
}
使用typeObject
动态地,让“执行时编译器”执行类型推断以计算出 T
. See the reference here.此外,恕我直言,您不需要 new ()
对 T
的约束在这里。
之后,您可以将任何类的实例传递给此方法,如下所示:
var memberRequestDTO = new MemberRequestDTO();
GetTypeValues((dynamic) memberRequestDTO);
用法:使用反射动态获取类型值
此方法返回包装到 IEnumerable<KeyValuePair<string, object>>
中的属性值.
public static IEnumerable<KeyValuePair<string, object>> GetTypeValues<T>(T typeObject) where T : class
{
// typeObject specific operations
IEnumerable<KeyValuePair<string, object>> typeValues =
typeObject
.GetType()
.GetProperties()
.Select(property => new KeyValuePair<string, object>(property.Name, property.GetValue(typeObject)));
return typeValues;
}
关于c# - 使用泛型将类和方法名称动态传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21965789/
我是一名优秀的程序员,十分优秀!