簡體   English   中英

如何使用反射獲取與特定類型匹配的對象字段的值列表?

[英]How do I use reflection to get a list of values of an object's fields that match a particular type?

請注意,為了簡潔和可讀性,我已替換了更易於使用的類型,字段和方法。

我已經為類Person定義了一個布爾屬性personProperty ,在該類中我希望getter get{}對在Person中定義的每個整數字段值(在本例中為_age personMethod(int arg)調用私有方法personMethod(int arg)_phoneNumber )。 它應該忽略所有其他類型,如readingList

這樣,如果我要向Person添加另一個整數字段(或修改或刪除任何Person字段名稱),則不必更新personProperty的定義,根據設計選擇,該定義取決於Person類的所有整數字段(即,永遠不會讓開發人員引入一個他不想讓personMethod運行的int字段)。

public Class Person
{
   private int _age;
   public int _phoneNumber;
   // protected int _futureInt;
   Dictionary<string, string> _readingList = new Dictionary<string, string>();

   public bool personProperty
   {
       get
       {
           // ...
           bool personPropertyReturnValue; 
           List<bool> resultList = new List<bool>();
           foreach(int personFieldValue in LISTOFPERSONINTS)
           {
               bool result = personMethod(personFieldValue);
               resultList.Add(result);
           }
           // Do stuff with `resultList` that'll initialize personPropertyReturnValue;
           return personPropertyReturnValue;
       }
   }

    private bool personMethod(int arg)
    {
       bool returnValue = true;
       // Do stuff to initialize `returnValue`
       return returnValue;
    }
}

我需要知道我應該代替LISTOFPERSONINTS ,使其返回了存儲在值的迭代_age_phoneNumber (以及其他所有未來int ,像_futureInt中定義Person )。

我不認為使用反射會比每次添加字段來調整屬性都要好,但是您可以:

public class Person
{
    private int _age;
    public int _phoneNumber;
    // protected int _futureInt;
    Dictionary<string, string> _readingList = new Dictionary<string, string>();

    public Person(int age){
        _age = age;
    }

    public bool personProperty
    {
        get
        {
            List<bool> resultList = new List<bool>();
            var intFields = this.GetType().GetFields(BindingFlags.Instance | 
                                                     BindingFlags.NonPublic | 
                                                     BindingFlags.Public)
                                          .Where(f => f.FieldType == typeof(int))
                                          .Select(f => f.GetValue(this)).Cast<int>();
            foreach (int personFieldValue in intFields)
            {
                bool result = personMethod(personFieldValue);
                resultList.Add(result);
            }
            // Do stuff with `resultList` that'll initialize personPropertyReturnValue;
            bool personPropertyReturnValue = resultList.All(b => b);
            return personPropertyReturnValue;
        }
    }

    private bool personMethod(int arg)
    {
        return (arg > 0);
    }
}

測試:

var person1 = new Person(0);
Console.WriteLine(person1.personProperty);   // False

var person2 = new Person(1);
Console.WriteLine(person2.personProperty);   // False

var person3 = new Person(1) { _phoneNumber = 1 };
Console.WriteLine(person3.personProperty);   // True

反思:如何從 object 中獲取值作為列表<object><div id="text_translate"><p>使用反射,我需要一個接受通用對象列表並打印其值的 function</p><pre> List&lt;Gender&gt; genders = new List&lt;Gender&gt; { new Gender { Id: 1, Name: "Male" }, new Gender { Id: 2, Name: "Female" } } PrintListValues(genders, "Name"); // prints Male, Female</pre><p> PrintListValues 必須接受列表為 object。 並且該列表可以包含任何類型的 object。 只要通用 object 有屬性傳入,它應該打印列表中每個項目的值。</p><pre> public static void PrintValues(object listObject) { // code here }</pre><p> 不幸的是,這就是項目要求的方式。</p><p> 一直在為這個問題撓頭,無法弄清楚。 反思對我來說太難了。 如果有人可以給我提示,那就太好了!</p></div></object>

[英]Reflection: how to get values from object as List<object>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 如何使用Reflection獲取特定接口類型的所有字段 如何使用反射來獲取方法的字段? 如何使用Reflection設置類型為List <CustomClass>的Property 如何使用反射獲取特定類型的通用列表 使用 C# 反射,如果該對象是列表內的對象的屬性,則如何獲取該對象的屬性及其值 如何在列表中獲取特定的派生對象 <T> ? 如何使用反射將類型對象轉換為C#中的列表。 我可以訪問對象中的屬性,但不能訪問值,有什么建議嗎? 反思:如何從 object 中獲取值作為列表<object><div id="text_translate"><p>使用反射,我需要一個接受通用對象列表並打印其值的 function</p><pre> List&lt;Gender&gt; genders = new List&lt;Gender&gt; { new Gender { Id: 1, Name: "Male" }, new Gender { Id: 2, Name: "Female" } } PrintListValues(genders, "Name"); // prints Male, Female</pre><p> PrintListValues 必須接受列表為 object。 並且該列表可以包含任何類型的 object。 只要通用 object 有屬性傳入,它應該打印列表中每個項目的值。</p><pre> public static void PrintValues(object listObject) { // code here }</pre><p> 不幸的是,這就是項目要求的方式。</p><p> 一直在為這個問題撓頭,無法弄清楚。 反思對我來說太難了。 如果有人可以給我提示,那就太好了!</p></div></object> 如何通過反射獲取委托類型的返回類型? 如何使用反射來獲取對象實例的公共屬性?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM