簡體   English   中英

一種使用C#在運行時讀取參數,屬性和返回類型的方法

[英]One method to read parameters, properties and return types at runtime using C#

繼續到我以前的線程使用反射讀取包含另一個對象數組的對象的屬性 我希望將EvgK中的這種出色方法變成一種通用方法,可以在我的代碼庫中的多個地方使用。

public static void GetMyProperties(object obj)
{
    List<MyPropertyInfo> oMyProp = new List<MyPropertyInfo>();
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties())
    {

        if (!Helper.IsCustomType(pinfo.PropertyType))
        {
            //add properties - name, value, type to the list
        }
        else
        {
            var getMethod = pinfo.GetGetMethod();

            if (getMethod.ReturnType.IsArray)
            {
                var arrayObject = getMethod.Invoke(obj, null);
                foreach (object element in (Array)arrayObject)
                {
                    foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties())
                    {
                        //add properties - name, value, type to the list
                    }
                }
            }
            else
            {
                List<MyPropertyInfo> oTempMyProp = GetMyProperties(prop.GetValue(obj, null));
                oMyProp.AddRange(oTempMyProp);
            }
        }


    }
}

同樣,我試圖讀取用戶傳遞的方法。 我列出了參數,它們的屬性和值。 用戶提供輸入值后,我將動態調用該方法以獲取結果對象。 結果將傳遞到GetMyProperties()方法,該方法列出所有屬性(到n級)-名稱,值和類型。

目前,我有兩種方法(下面的定義):

public List<MyPropertyInfo> GetMyProperties(Type type);

public List<MyPropertyInfo> GetMyProperties(object obj);

我使用第一個顯示所選方法的所有參數及其屬性(名稱,值和類型)的列表。

MethodInfo members = type.GetMethod(this.MethodName);
ParameterInfo[] parameters = members.GetParameters();
List<MyPropertyInfo> oMyProp = new List<MyPropertyInfo>();
foreach (var parameter in parameters)
{
    oMyProp = GetMyProperties(parameter.ParameterType);    
}

..創建我的屬性列表,以便用戶可以輸入參數。 我通過ParameterType和GetProperties方法檢查它是否為自定義類型。 如果是自定義類型,則它將以該類型遞歸調用自身以構建一個列表,該列表綁定到網格以供輸入。

第二種方法GetMyProperties(object obj)用於列出返回對象。 由於我在編譯時不知道所選方法的返回類型,因此請使用對象類型。 我想知道是否可以修改第二種方法以某種方式使用它來讀取參數,屬性和返回類型? 而不是使用單獨的方法? 嘗試重用代碼。

我不確定我是否理解正確,但是如果您想將兩種方法合而為一,則可以在兩種情況下都傳遞對象,但要檢查object是否為Type並為這種情況提供不同的邏輯:

public static void GetMyProperties(object obj)
{
   if (obj is Type)
   {
      Type type = obj as Type;
      ... here is the first method logic ...
   } 
   else 
   {
      ... here is the second method logic ...
   }
}

暫無
暫無

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

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