gpt4 book ai didi

c# - 使用泛型将类和方法名称动态传递给方法

转载 作者:行者123 更新时间:2023-11-30 18:30:05 25 4
gpt4 key购买 nike

我想动态地将一个类名和一个方法名传递给一个方法并保持动态,我知道我应该使用泛型和可能的约束。

例子,我有一个类

MemberRequestDTO    (contains several properties)

我还有一个方法叫做

RecordsToRetrieve

使用一些反射我想动态获取属性的值,我想出了如何做到这一点,但后来我意识到这是太难的代码并且紧密耦合,我想时间重构并创建一个带有使用带有约束的泛型的签名的方法。在理解使用和约束等方面遇到困难。

所以我想传入一个类名并能够在方法中使用它,通过反射我打算像这样使用它:

类型 type = typeof(classname);

我开始阅读和研究,并开始使用这样的代码:

public void GetTypeValues<T>() where T : class , new()
  1. 如何传入 MemberRequestDTO 的类名?
  2. Generic 对我有什么新意义?
  3. 如何将类名传递给括号 ()?
  4. 如果我使用它是否也会传递给括号?
  5. 如何传入类和方法?
  6. 阅读上面的“Where T has the constraints (enforced) to be the type”class 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)      

(这是我的实际问题,传递到我实例化的任何类,让方法“处理”处理该类,循环遍历属性并动态获取属性的名称值是的,它可能不会保持无效方法)

传入 memberRequestDTO 应该带引号还是不带引号?我希望能够将类的任何实例传递给成员,然后对其进行更多操作。 () T 应该在那里吗? parens () 应该为空还是包含类对象的通用参数?

最佳答案

这是你的答案:

  1. GetTypeValues<MemberRequestDTO>()
  2. new()Type Parameter - T 的约束.它说类型参数 T必须有一个公共(public)的无参数构造函数。在你的情况下,MemberRequestDTO类必须是如下所示的公共(public)无参数构造函数:

    public class MemberRequestDTO
    {
    public MemberRequestDTO() { ... }
    }
  3. 类名是reference type ,您可以将其作为 type 传递像这样进入 parent :SomeMethod(typeof(MemberRequestDTO));其中方法的签名是 void SomeMethod(Type type) { }

  4. 如果您将类(class)作为 type parameter 传递与第 (1) 点一样,它不会传递到 parens()

  5. 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);

编辑 2:

用法:使用反射动态获取类型值

此方法返回包装到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com