在C#中,是否可以使用手写界面进行动态变换?我正在使用COM自动化与应用程序连接,虽然我可以访问这样的属性:
dynamic shape = comObject;
int Width = (int)shape.Width;
..我真的更喜欢使用它:
interface PageShape {
int Width {get; set;}
int Height {get; set;}
}
PageShape shape2 = (PageShape)comObject;
int Width = shape.Width; // COOL!
这可能吗?这通常会触发InvalidCastException
,但我只是想知道它是否可能。有关我的具体方案here的详细信息。
答案 0 :(得分:2)
由于您无法访问原始代码,因此您必须在自己的图层中添加。据我所知,你将无法绕过从dynamic
到实际界面的转换,但是你可以在一层中进行转换并在之后使用实际的OOP。
这可能是一个示例实现:
void Main()
{
IPageShape pageInfo = ComTransformer.GetPageShape(comObject);
}
interface IPageShape {
int Width { get; set; }
int Height { get; set; }
}
class PageShapeImpl : IPageShape {
public int Width { get; set; }
public int Height { get; set; }
}
static class ComTransformer {
public static IPageShape GetPageShape(dynamic obj) {
return new PageShapeImpl {
Width = (int) obj.Width,
Height = (int) obj.Height
};
}
}
答案 1 :(得分:0)
dynamic不会使实际对象动态化,除非它是动态对象,它只是告诉编译器在运行时解析变量。
因此,如果动态变量中的对象是实现接口的对象,那么它将起作用,否则你将获得强制转换异常
例如,这将在第一次呼叫时起作用,但不在第二次呼叫上起作用:
interface ITheInterface{}
class TheClass : ITheInterface{}
class OtherClass {}
public static void Main(string[] args)
{
NextMethod(new TheClass());
NextMethod(new OTherClass());
}
public static NextMethod(dynamic d)
{
//works on the first call but not the second
TheInterface ti = (ITheInterface)d;
}