簡體   English   中英

如何識別哪些方法是getter和setter?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM