如何在引用程序集时强制转换类型

时间:2016-03-15 19:38:34

标签: c# casting

鉴于

通过强制转换转换类型的扩展方法。

    public static dynamic SwitchType(this dynamic ppo, 
        string classname, Action<dynamic> callback)
    {
        Type obj= Assembly.GetExecutingAssembly()
            .GetTypes()
            .Where(p => p.Name == classname)
            .First();
        var converted =(obj)ppo; <-- Error Here
        callback(converted);
    }

问题

编译器告诉我它找不到obj,所以演员不会工作。

也许我让这个过于复杂,但传入的ppo是一个运行时对象,我想将其转换为之前创建的同一运行时对象的特定类型,并包含我需要的特定静态字段文本。

我已经验证了obj在其他代码中的返回,以便部分正常工作。

更多信息

我们正在使用相同的类名解析网页中的大约11个不同的表。我想在一个地方为所有11行写一遍所有断言。每一行都有不同的内容,因此我必须在创建它时拥有保存类的实例,但我在运行时拥有的只是类名。每次调用TestEditorFields时,我们都有一个不同的页面对象,结构相同,只是属性值不同。

 private void TestEditorFields(dynamic ppo)
        {
            Assert.IsTrue(ppo.ActualHeaderText == ppo.ExpectedHeaderText, "UTSC1160-The actual header text was not as expected");
            Assert.IsTrue(ppo.ActualInputText == ppo.ExpectedInputText, "UTSC1170-The actual inputs text was not as expected");
            Assert.IsTrue(ppo.ActualLabelText == ppo.ExpectedLabelText, "UTSC1180-The actual labels text was not as expected");
            Assert.IsTrue(ppo.ActualRowHTML == ppo.ExpectedRowHTML, "UTSC1190-The HTML of the content rows was not as expected");
            Assert.IsTrue(ppo.ActualSelectedText == ppo.ExpectedSelectedText, "UTSC1200-The Selected Options are not as expected");
            Assert.IsTrue(ppo.ActualWarningText == ppo.ExpectedWarningText, "UTSC1210-The actual warning text is not as expected");
        }

2 个答案:

答案 0 :(得分:3)

在很多问题中似乎错过了.NET最强大的功能之一:表达式树

使用表达式树,您可以生成一个表达式,该表达式可以编译到委托中以执行所需的转换( bye bye reflection )。

例如:

var paramExpr = Expression.Parameter(typeof(object));
var convertExpr = Expression.Convert(paramExpr, obj);
var lambdaExpr = Expression.Lambda(convertExpr, paramExpr);
var compiledExprDelegate = lambdaExpr.Compile();

现在您可以使用Delegate.DynamicInvoke

来呼叫代理人
object conversionResult = compiledExprDelegate.DynamicInvoke(ppo);

由于您使用dynamic处理DLR,上述代码应该适用于您的方案......

答案 1 :(得分:0)

您无法将对象实例转换为您在编译时不知道的类型。

您需要目标类型实现的基类或接口。 或者通过反映这个对象找到一个特定的方法。

MethodInfo methodInfo = type.GetMethod(methodName);
methodInfo.Invoke(methodInfo, parametersArray);