gpt4 book ai didi

c# - 如何识别哪些方法是 getter 和 setter?

转载 作者:太空狗 更新时间:2023-10-30 01:28:48 25 4
gpt4 key购买 nike

我正在尝试使用反射来获取所有类方法。我想准备一个算法来识别哪些方法是 getter 和 setter。

因此,如您所见,我正在以以下格式打印每个 getter:{name} 将返回 {Return Type}。我正在尝试以以下格式打印所有 setter:{name} will set field of {Parameter Type},但我不知道如何获取 参数类型.

public string CollectGettersAndSetters(string className)
{
Type classType = Type.GetType(className);

MethodInfo[] getters = classType
.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
.Where(m => m.Name.StartsWith("get"))
.ToArray();

MethodInfo[] setters = classType
.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
.Where(m => m.Name.StartsWith("set"))
.ToArray();

StringBuilder sb = new StringBuilder();

foreach (MethodInfo getter in getters)
{
sb.AppendLine($"{getter.Name} will return {getter.ReturnType}");
}

foreach (MethodInfo setter in setters)
{
sb.AppendLine($"{setter.Name} will set field of {?}");
}

return sb.ToString().TrimEnd();
}

我将使用该方法的类示例:

public class Hacker
{
public string username = "securityGod82";
private string password = "mySuperSecretPassw0rd";

public string Password
{
get => this.password;
set => this.password = value;
}

private int Id { get; set; }

public double BankAccountBalance { get; private set; }

public void DownloadAllBankAccountsInTheWorld()
{
}
}

预期的输出是:

get_Password will return System.String
get_Id will return System.Int32
get_BankAccountBalance will return System.Double
set_Password will set field of System.String
set_Id will set field of System.Int32
set_BankAccountBalance will set field of System.Double

提前致谢!

最佳答案

可以得到第一个参数,然后使用ParameterType:

var parameter = setter.GetParameters()[0];
sb.AppendLine($"{setter.Name} will set field of {parameter.ParameterType}");

我建议你多做一些检查,以确保它实际上是一个 setter:

var parameters = setter.GetParameters();
if (parameters.Length != 1) { continue; }
sb.AppendLine($"{setter.Name} will set field of {parameters[0].ParameterType}");

编辑:

实际上,您可以通过先获取属性来获取 setter ,然后调用 GetSetMethod方法,这是一种比遍历所有方法更安全的方法。

MethodInfo[] setters = classType
.GetProperties()
.Select(x => x.GetSetMethod(true))
.Where(x => x != null).ToArray();

同样的事情也适用于 getters - 使用 GetGetMethod

关于c# - 如何识别哪些方法是 getter 和 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202264/

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