使用动态变量的接口

时间:2013-12-28 21:08:01

标签: c# dynamic interface com

在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的详细信息。

2 个答案:

答案 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;

}