Можете ли да използвате общ метод GetType() и ако не, как да се справите с това?

Опитвам се да прочета стойности от API, управляван от база данни, наречен Quickbase. Също така се опитвам да напиша много общ метод, който да обработва свойства, които извиквам от базата данни, да задавам свойства в клас, наречен BaseSettings.cs.

Няма винаги да имам всички свойства във всяка таблица, така че не винаги ще знам какви свойства влизат. Например един обект [TaxForm] може да използва само 4 от 19-те налични свойства, а друг може да използва всички.

Така че вместо да пиша проверки за всяко едно, правя заявка за всички полета в текущата таблица и след това намирам какви налични свойства мога да задам, използвайки отражение, и името на полето.

Въпросът ми е кастинг на стойностите на неизвестни типове. Как мога да направя това като променлива, показана в метода по-долу.

Правилно ли го правя, или трябва да използвам параметър като стойност, която трябва да се зададе, и след това да получа типа на стойността от извикването на quickbase за всяко свойство, докато го изтеглям от таблиците и го задавам на текущия обект за него.

Моят пример в момента е следният:

 public virtual void SetProperty(string propertyName, object propertyValue)
    {
        if(String.IsNullOrEmpty(propertyName))
        {
            throw new Exception("Property name cannot be null or empty while setting value from quickbase. Make sure yor query to the API is returning a property name! [Filed Title:Label]");
        }
        else
        {
            try
            {
                // Get the Type object corresponding to MyClass.
                Type myType = typeof(BaseSetting);
                // Get the PropertyInfo object by passing the property name.
                PropertyInfo myPropInfo = myType.GetProperty(propertyName);

                if(myPropInfo)
                {
                    this.GetType().GetProperty(propertyName).SetValue(this, propertyValue as this.GetType().GetProperty(propertyName).GetType();
                }

                // Display the property name.

            }
            catch (NullReferenceException e)
            {
                Console.WriteLine("The property does not exist in our BaseSettings. PLease verify that it exist in the class design, or that the corrct field is being pulled form Quickbase. Error:" + e.Message);
            }
        }
    }

Там, където задавам новата стойност [може да е string, bool, int, ect], е въпросът ми. Мога ли да кастя, използвайки метод, както е показано по-долу, или не.

if(myPropInfo)
{
     this.GetType().GetProperty(propertyName).SetValue(this, propertyValue as this.GetType().GetProperty(propertyName).GetType());
}

Благодаря предварително!


person Casey    schedule 16.10.2014    source източник
comment
какво се случва, когато го преминете без кастинг? и как се компилира if(myPropInfo)? имаш предвид if(myPropInfo != null) ?   -  person Selman Genç    schedule 16.10.2014
comment

След инсталиране на кристални отчети, ако не се показва в отчетите в кутията с инструменти, щракнете с десния бутон върху Отчитане в кутията с инструменти и изберете Избор на елементи, ще се отвори прозорец. В този прозорец изберете компоненти на .NET Framework, той ще обнови списъка, проверете списъка необходими CrystalReportSource, CrystalReportSource и т.н. Сега можете да видите инструментите за кристални отчети в кутията с инструменти в менюто за отчитане.

  -  person Ben Robinson    schedule 16.10.2014
comment
Току що го открих. Да, съжалявам, кодът имаше печатна грешка. Ще публикувам какво направих.   -  person Casey    schedule 16.10.2014
comment
О, никога не съм използвал обект като този. Разбирам какво имаш предвид. Благодаря, току що научих две неща.   -  person Casey    schedule 16.10.2014


Отговори (1)


Ето какво направих. Аз съм нов в генеричните лекарства и използвах метода като тип.

 public virtual void SetProperty(string propertyName, object propertyValue)
    {

        if(String.IsNullOrEmpty(propertyName))
        {
            throw new Exception("Property name cannot be null or empty while setting value from quickbase. Make sure yor query to the API is returning a property name! [Filed Title:Label]");
        }
        else
        {
            try
            {
                // Get the Type object corresponding to MyClass.
                Type myType = typeof(BaseSetting);
                // Get the PropertyInfo object by passing the property name.
                PropertyInfo myPropInfo = myType.GetProperty(propertyName);

                if (myPropInfo != null)
                {
                    this.GetType().GetProperty(propertyName).SetValue(this, propertyValue);
                }


            }
            catch (NullReferenceException e)
            {
                Console.WriteLine("The property does not exist in our BaseSettings. PLease verify that it exist in the class design, or that the corrct field is being pulled form Quickbase. Error:" + e.Message);
            }
        }
    }
person Casey    schedule 16.10.2014