2016-10-22 8 views
0

Я создал метод для возврата значения по умолчанию из любого класса. Я пытаюсь использовать Reflection, чтобы получить значение, но оно не работает.Reflection не получает пользовательский класс в C#

Вот класс со значением по умолчанию, что я хочу (StoredProcedure):

namespace Services.Data.Report 
{ 
    public class PayrollReport 
    { 
    public string FullName { get; set; } 
    public DateTime WeekStart { get; set; } 
    public decimal PerDiem { get; set; } 
    public decimal StPay { get; set; } 
    public decimal OtPay { get; set; } 
    public decimal StraightHours { get; set; } 
    public decimal OverTimeHours { get; set; } 

    [DefaultValue("report_payrollSummary")] 
    public string StoredProcedure { get; set; } 
    } 
} 

У меня есть этот метод, который позволит мне передать имя класса, и мы надеемся получить требуемое значение поля:

namespace Services 
{ 
    public class DynamicReportService : IDynamicReportService 
    {  
    public string GetDynamicReport(string className) 
    { 
     System.Reflection.Assembly assem = typeof(DynamicReportService).Assembly; 
     var t = assem.GetType(className); 
     var storedProcedure = t?.GetField("StoredProcedure").ToString(); 
     return storedProcedure; 
    } 
    } 
} 

Я также попытался это, но получить те же результаты:

var t = Type.GetType(className); 

Проблема в том, что t никогда не устанавливается.

Я пытаюсь вызвать его с чем-то вроде этого:

var storedProc = _dynamicReportService.GetDynamicReport("Services.Data.Report.PayrollReport"); 

Есть еще один способ передать Class по имени и быть в состоянии получить доступ к полям, методы и другие свойства?

+2

Вы передаете полное имя сборки класса в классеName? это должно быть «namespace.classname, assemblyname», поэтому «Services.Data.Report.PayrollReport, Services.Data.Report», если пространство имен соответствует сборке. Для проверки вы можете запустить это в классе и захватить вывод: this.GetType(). AssemblyQualifiedName – jimpaine

+0

Что вы ожидаете получить при вызове 'GetDynamicReport'? В вашем примере вы ожидаете получить строку со значением «report_payrollSummary»? – RVid

+0

Если вы хотите получить значение 'Attribute' в' Property', вам нужно будет получить свойство (это не поле) и использовать отражение для этого атрибута. 'ToString()' не даст вам этого. См. Например http://stackoverflow.com/q/6637679/224370 –

ответ

2

Попробуйте это:

System.Reflection.Assembly assembly = typeof(DynamicReportService).Assembly; 
var type = assembly.GetType(className); 
var storedProcedurePropertyInfo = type.GetProperty("StoredProcedure"); 
var defaultValueAttribute = storedProcedurePropertyInfo.GetCustomAttribute<DefaultValueA‌​ttribute>(); 
return defaultValueAttribute.Value.ToString(); 

Сначала мы получим StoredProcedure PropertyInfo от типа, то мы будем искать DeafultValueAttribute недвижимости с использованием GetCustomAttribute<T> расширения и в конце концов мы будем принимать значение атрибута и вернуть его.

+1

Лучше использовать 'var deafultValueAttribute = storedProcedurePropertyInfo.GetCustomAttribute ();' (метод расширения с .NET 4.5 (2012), требует 'using System.Reflection;'). –

 Смежные вопросы

  • Нет связанных вопросов^_^