簡體   English   中英

如何將屬性類型發送到泛型方法

[英]How to send a property type to generic method

我有一個負責讀取類型的通用方法。

 public List<GetDomainNameViewModel> GetDomainName<T>()
    {
        List<GetDomainNameViewModel> getDomainNameViewModels= new List<GetDomainNameViewModel>();

        var propertyInfos = typeof(T).GetProperties();

        for (int i = 0; i < propertyInfos.Length; i++)
        {
         Type type = Type.GetType(propertyInfos[i].DeclaringType.Name);

        /*Recursive mode*/
        var model2 = GetDomainName<type>();

        /*Recursive mode*/

            if (propertyInfos[i].CustomAttributes.Count() > 0)
            {
                var attrs = propertyInfos[i].GetCustomAttributes(true);
                foreach (var attr in attrs)
                {
                    JsonConverterAttribute rangeAttribute = attr as JsonConverterAttribute;
                    if (rangeAttribute != null)
                    {
                        var attProp = rangeAttribute.ConverterParameters;
                        var attpropList = attProp.FirstOrDefault().ToString().Split(';');

                        foreach (var item in attpropList)
                        {
                            if (item.StartsWith("Range"))
                            {
                              //  [Newtonsoft.Json.JsonConverter(typeof(ESBJsonConverter), "Range(1::100)=>6; NonEmptyString=>1313;Length(:16)=>1114")]
                                GetDomainNameViewModel model = new GetDomainNameViewModel();

                                /*get min value*/
                                int endIndex = item.IndexOf(':'), startIndex = item.IndexOf('(') + 1;
                                int length = endIndex - startIndex;
                                string extracted = item.Substring(startIndex, length);
                                /*Endget min value*/

                                /*get max value*/
                                int endMaxIndex = item.IndexOf(')'), startMaxIndex = item.IndexOf(':', item.IndexOf(':')) + 1;
                                int lengthMax = endMaxIndex - startMaxIndex;
                                string extractedMax = item.Substring(startMaxIndex + 1, lengthMax - 1);
                                /*Endget max value*/
                                /*get error code*/
                                string errorCode = item.Substring(item.IndexOf('>') + 1, (item.Length - 1) - item.IndexOf('>'));
                                /*get error code*/
                
                                model.FieldName = propertyInfos[i].Name;
                                model.MinVal = extracted;
                                model.MaxVal = extractedMax;
                                model.ErrorCode = errorCode;


                                /*Set errorMessage*/
                                StringBuilder errorMessage = new StringBuilder(ErrorsDictionary.ErrorList[Convert.ToInt32(errorCode)]);
                                errorMessage.Replace("{0}", model.FieldName).Replace("{1}", model.MinVal).Replace("{2}", model.MaxVal).Replace("{3}", model.ErrorCode);

                                /*End Set errorMessage*/
                                model.ErrorMessage = errorMessage;

                                getDomainNameViewModels.Add(model);

                            }
                            else if (item.StartsWith("NonEmptyString"))
                            {
                                //[JsonConverter(typeof(ESBJsonConverter), "NonEmptyString=>3064")]
                                GetDomainNameViewModel model = new GetDomainNameViewModel();

                                /*get error code*/
                                string errorCode = item.Substring(item.IndexOf('>') + 1, (item.Length - 1) - item.IndexOf('>'));
                                /*get error code*/

                                model.FieldName = propertyInfos[i].Name;
                                model.ErrorCode = errorCode;


                                /*Set errorMessage*/
                                StringBuilder errorMessage = new StringBuilder(ErrorsDictionary.ErrorList[Convert.ToInt32(errorCode)]);
                                errorMessage.Replace("{0}", model.FieldName).Replace("{1}", model.ErrorCode);

                                /*End Set errorMessage*/
                                model.ErrorMessage = errorMessage;

                                getDomainNameViewModels.Add(model);

                            }
                            else if (item.StartsWith("Length"))
                            {
                                // [JsonConverter(typeof(ESBJsonConverter), "Length(1:16)=>1194;")]
                                GetDomainNameViewModel model = new GetDomainNameViewModel();

                                /*get error code*/
                                string errorCode = item.Substring(item.IndexOf('>') + 1, (item.Length - 1) - item.IndexOf('>'));
                                /*get error code*/

                                /*get min value*/
                                int startIndex = item.IndexOf('(') + 1;
                                int endIndex = item.IndexOf(':');
                                int length = endIndex - startIndex;
                                string extracted = item.Substring(startIndex, length);
                                /*Endget min value*/

                                /*get max value*/
                                int startMaxIndex = item.IndexOf(':', item.IndexOf(':')) ;
                                int endMaxIndex = item.IndexOf(')');
                                int lengthMax = endMaxIndex - startMaxIndex;
                                string extractedMax = item.Substring(startMaxIndex + 1, lengthMax-1 );
                                /*Endget max value*/


                                model.FieldName = propertyInfos[i].Name;
                                model.MinVal = extracted;
                                model.MaxVal = extractedMax;
                                model.ErrorCode = errorCode;


                                /*Set errorMessage*/
                                StringBuilder errorMessage = new StringBuilder(ErrorsDictionary.ErrorList[Convert.ToInt32(errorCode)]);
                                errorMessage.Replace("{0}", model.FieldName).Replace("{1}", model.MinVal).Replace("{2}", model.MaxVal).Replace("{3}", model.ErrorCode);

                                /*End Set errorMessage*/
                                model.ErrorMessage = errorMessage;

                                getDomainNameViewModels.Add(model);


                            }

                            else if (item.StartsWith("NumericString"))
                            {
                           //     [JsonConverter(typeof(ESBJsonConverter), "NumericString=>1194;NonEmptyString=>1313;Length(8:8)=>1114;PDateTime(yyyyMMdd)=>1207")]
                                GetDomainNameViewModel model = new GetDomainNameViewModel();

                                /*get error code*/
                                string errorCode = item.Substring(item.IndexOf('>') + 1, (item.Length - 1) - item.IndexOf('>'));
                                /*get error code*/                                  
                                model.FieldName = propertyInfos[i].Name;
                                    model.ErrorCode = errorCode;

                                /*Set errorMessage*/
                                StringBuilder errorMessage = new StringBuilder(ErrorsDictionary.ErrorList[Convert.ToInt32(errorCode)]);
                                errorMessage.Replace("{0}", model.FieldName).Replace("{1}", model.MinVal).Replace("{2}", model.MaxVal).Replace("{3}", model.ErrorCode);

                                /*End Set errorMessage*/
                                model.ErrorMessage = errorMessage;

                                getDomainNameViewModels.Add(model);


                            }
                            else if (item.StartsWith("PDateTime"))
                            {
                             //   [JsonConverter(typeof(ESBJsonConverter), "NumericString=>1194;NonEmptyString=>1313;Length(8:8)=>1114;PDateTime(yyyyMMdd)=>1207")]
                                GetDomainNameViewModel model = new GetDomainNameViewModel();

                                /*get error code*/
                                string errorCode = item.Substring(item.IndexOf('>') + 1, (item.Length - 1) - item.IndexOf('>'));
                                /*get error code*/
                                model.FieldName = propertyInfos[i].Name;
                                model.ErrorCode = errorCode;

                                /*Set errorMessage*/
                                StringBuilder errorMessage = new StringBuilder(ErrorsDictionary.ErrorList[Convert.ToInt32(errorCode)]);
                                errorMessage.Replace("{0}", model.FieldName).Replace("{1}", model.ErrorCode);

                                /*End Set errorMessage*/
                                model.ErrorMessage = errorMessage;

                                getDomainNameViewModels.Add(model);


                            }


                        }

                    }
                }
            }
        }
        return getDomainNameViewModels;

    }

我這里有一個類型:

   public class Student
{
    public Student()
    {
    }

    [JsonConverter(typeof(ESBJsonConverter), "NonEmptyString=>1313")]
    public List<Student> Students { get; set; }
    [Newtonsoft.Json.JsonConverter(typeof(ESBJsonConverter), "range(1::100)=>6; nonemptystring=>1313;length(:16)=>1114")]
    public int studentid { get; set; }

    [Required]
    [Newtonsoft.Json.JsonConverter(typeof(ESBJsonConverter), "range(18::29)=>6; nonemptystring=>1313;length(:16)=>1114")]
    public string studentname { get; set; }

    [Range(10, 20)]
    public int age { get; set; }


    [JsonProperty(Required = Required.Always)]
    [JsonConverter(typeof(ESBJsonConverter), "NonEmptyString=>3064;")]

    public string iban { get; set; }

    [JsonProperty(Required = Required.Always)]
    [JsonConverter(typeof(ESBJsonConverter), "Length(1:16)=>1194;")]
   /public long Amount { get; set; }


    public List<long> Amounts { get; set; }


    [JsonProperty(Required = Required.Always)]
    [JsonConverter(typeof(ESBJsonConverter), "NumericString=>1194;NonEmptyString=>1313;Length(8:8)=>1114;PDateTime(yyyyMMdd)=>1207")]
    public string DueDate { get; set; }




    [JsonConverter(typeof(ESBJsonConverter), "NonEmptyString=>1313")]

    public List<long> Amounts { get; set; }



}

這里重要的是我在 class student 中有一個復雜類型的屬性 Students,我必須在 GetDomainName 方法中讀取所有自定義屬性。

我在這里有些掙扎 Type type = Type.GetType(propertyInfos[i].DeclaringType.Name);

        /*Recursive mode*/
        var model2 = GetDomainName<type>();

        /*Recursive mode*/

我在這里收到此錯誤:

type 是一個變量,但用作類型

指定泛型類型參數時,必須使用數據類型。 聲明變量時無效的任何內容在那里也無效。 你希望能夠做到這一點:

type myStudent = new type();

我希望不會,並且出於顯而易見的原因。 調用泛型方法時原因相同。 正如當您聲明一個變量時,您是在向編譯器提供一條指令,所以很明顯,直到運行時才知道的信息是無效的。 如果您在編譯時不知道數據類型,那么您就不能簡單明了地調用該方法。

最后我發現我可以通過這種方式實現它並且我以這種方式更改了我的代碼。 我將我的方法改為:

public List<GetDomainNameViewModel> GetDomainName(Type T)

並這樣稱呼它:

var x = propertyInfo.PropertyType;

                /*Recursive mode*/
                var model2 = GetDomainName(x);

暫無
暫無

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

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