我可以使用反射来实例化从通用基类继承的类吗?

时间:2017-11-30 18:06:36

标签: c# generics reflection

我想知道是否有一种整洁的方法来使用反射来实例化类中的一堆属性,其中一个约束是要实例化的属性类型应该只从某些类继承,以及如果这些类中的一个具有泛型类型参数。

例如......

public class Control
{
    public string Name => "Test Name";
}

public abstract class BasePage<T> { }

public class HomePage : BasePage<HomePage> { }

public class LoginPage : BasePage<LoginPage>
{
    public Control Test { get; set; } = new Control();
}

public class LoginLinkPage : BasePage<LoginLinkPage>
{
    public Control Test { get; set; } = new Control();
}

public class UserPage : HomePage
{
    public Control Test { get; set; } = new Control();
}

public class Pages
{
    public UserPage UPage { get; set; }
    public LoginPage LPage { get; set; }
    public LoginLinkPage LLPage { get; set; }
} 

是否可以在单个方法中实例化Pages中的所有属性?并允许添加和实例化更多属性,假设它们继承自BasePage<T>HomePage

这是我到目前为止所做的,但它只检查属性类型的子类是主页...

class Program
{
    public static void InitializeControls<T>(T page)
    {
        var pageType = typeof(T);

        var properties = pageType.GetProperties().Where(p => p.PropertyType.IsSubclassOf(typeof(HomePage)));

        foreach (var property in properties)
        {
            property.SetValue(page, Activator.CreateInstance(property.PropertyType));
        }
    }

    static void Main(string[] args)
    {
        var pages = new Pages();

        InitializeControls(pages);

        Console.WriteLine(pages.UPage.Test.Name); // "Test Name"
        Console.WriteLine(pages.LLPage.Test.Name); // NullReferenceException
        Console.WriteLine(pages.LPage.Test.Name);  // NullReferenceException       

        Console.ReadLine();
    }
}

如果T可以是各种不同的类型,我无法理解是否可以检查BasePage<T>

我愿意设计可能解决此问题的更改。

谢谢,

0 个答案:

没有答案