[英]How to recognize which methods are getters and setters?
我正在嘗試使用反射來獲取所有類方法。 我想准備一個算法來識別哪些方法是getter和setter。
因此,如您所見,我將以格式打印每個getter : {name} will return {Return Type}
。 我試圖以格式打印所有的setter : {name} will set field of {Parameter Type}
,但我不知道如何獲取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}");
我建議你做一些檢查,只是為了確保它實際上是一個二傳手:
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();
GetGetMethod
適用於getter。
您可以使用以下命令獲取參數列表:
var parameters = setter.GetParameters();
由於它是一個setter,它只有一個參數,所以你可以這樣做
var setterType = setter.GetParameters().First().ParameterType;
訪問其Type
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.