c# - 使用GetType()和反射进行转换

时间:2017-05-10 11:30:29

标签: c# reflection

因此,在使用this教程实施Page Object Pattern后,我有几个 源自BasePageElementMap

的页面

我想处理一些操作,所以我有这个课程:

public class DownloadAttachmentsHandler
    {
        public DownloadAttachmentsHandler(BasePageElementMap basePageElementMap)
        {
            Type type = basePageElementMap.GetType();            
        }
    }

Pages派生的每个BasePageElementMap都有html个元素,这些元素位于从BasePageElementMap派生的类中,并且来自此Page我有Map {1}}包含我正在使用的所有HTML元素的对象。

public class YahooEmailPage: BasePage<YahooEmailPageElementMap, YahooEmailPageValidator>...

所以如果我这样称呼这个函数:

UploadAttachmentsHandler att = new UploadAttachmentsHandler(new YahooEmailPage().Map);

我想从我的YahooEmailPage方法中将其转换为DownloadAttachmentsHandler

所以目前我有这个type对象,如何将其加入YahooEmailPage

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要以下内容:

public class DownloadAttachmentsHandler
{
    public static object Cast(object obj, Type t)
    { 
        try
        {
            var param = Expression.Parameter(obj.GetType());
            return Expression.Lambda(Expression.Convert(param, t), param)
                 .Compile().DynamicInvoke(obj);
        }
        catch (TargetInvocationException ex)
        {
             throw ex.InnerException;
        }         
    }


    public DownloadAttachmentsHandler(BasePageElementMap basePageElementMap)
    {
        Type type = basePageElementMap.GetType();
        dynamic foo = Cast(basePageElementMap, type);
    }
}

基于balage的this回答。

编辑:对于该示例,我们假设GetType()返回类型bar。您将不得不创建一个像这样的方法:

public static void UseDynamic(bar input)
{
    // Stuff
}

然后再做

public DownloadAttachmentsHandler(BasePageElementMap basePageElementMap)
{
    Type type = basePageElementMap.GetType();
    dynamic foo = Cast(basePageElementMap, type);
    UseDynamic(foo);
}

您可以使用重载来避免编写许多if或开关。但是,无论采用哪种方法,都必须为每种可能的类型创建一种方法。