鉴于
通过强制转换转换类型的扩展方法。
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");
}
答案 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);