2014-10-09 3 views
0

Я пытаюсь получить доступ к свойству подкласса через отражение. Но это не работает. Как получить доступ ко всем свойствам подкласса?C#: Reflection: свойство доступа подкласса

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

public abstract class FakeDbContext 
{ 
    public FakeDbSet<T> Set<T>() where T : class, IObjectState 
    { 
     foreach (PropertyInfo property in GetType().GetProperties()) 
     { 
      if (property.PropertyType == typeof(FakeDbSet<T>)) 
       return property.GetValue(this, null) as FakeDbSet<T>; 
     } 
     throw new Exception("Type collection not found"); 
    } 
} 

Подкласс с параметрами

public class MockDbContext : FakeDbContext 
{ 
    private FakeDbSet<Address> Addresses { get; set; } 
    private FakeDbSet<EmailAddress> EmailAddresses { get; set; } 
    private FakeDbSet<PhoneNumber> PhoneNumbers { get; set; } 
    private FakeDbSet<BaseContact> Contacts { get; set; } 
    private FakeDbSet<Environment> Environments { get; set; } 
    private FakeDbSet<Data.Entities.InformationService> InformationServices { get; set; } 
    private FakeDbSet<UserEnvironmentConfiguration> UserEnvironmentConfigurations { get; set; } 
    private FakeDbSet<Customer> Customers { get; set; } 
    private FakeDbSet<UserEnvironmentConfigurationSet> UserEnvironmentConfigurationSets { get; set; } 

    public MockDbContext() 
    { 
     Addresses = new FakeDbSet<Address>(); 
     EmailAddresses = new FakeDbSet<EmailAddress>(); 
     PhoneNumbers = new FakeDbSet<PhoneNumber>(); 
     Contacts = new FakeDbSet<BaseContact>(); 
     Environments = new FakeDbSet<Environment>(); 
     InformationServices = new FakeDbSet<Data.Entities.InformationService>(); 
     UserEnvironmentConfigurations = new FakeDbSet<UserEnvironmentConfiguration>(); 
     Customers = new FakeDbSet<Customer>(); 
     UserEnvironmentConfigurationSets = new FakeDbSet<UserEnvironmentConfigurationSet>(); 

     InitData(); 
    } 
} 

ответ

2

Чтобы получить личные свойства, нужно использовать BindingFlags.NonPublic используя перегрузку GetProperties, который принимает BindingFlags в качестве параметра.

foreach (PropertyInfo property in GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic)) 
{ 
    ... 
} 
Смежные вопросы