【发布时间】:2010-12-07 03:46:43
【问题描述】:
public int Set(int newValue,Object obj)
{
//System.Windows.Forms.Control ctrl = (System.Windows.FormsControl)Object;
}
这里的Object是COM对象。现在我想将它转换为 .NET 对象并获取它的属性。最简单的方法是什么?
【问题讨论】:
标签: c# com components
public int Set(int newValue,Object obj)
{
//System.Windows.Forms.Control ctrl = (System.Windows.FormsControl)Object;
}
这里的Object是COM对象。现在我想将它转换为 .NET 对象并获取它的属性。最简单的方法是什么?
【问题讨论】:
标签: c# com components
您不能直接将 COM 对象转换为 Windows.Forms.Control 对象。它不是那种特定的类型。
如果您使用正确的类型库,COM 对象应该为您提供它自己的属性。如果您将其转换为适当的类型,您应该能够直接使用它的属性。
【讨论】:
所讨论的对象是 COM 对象这一事实不是问题。您不必将其转换为 .NET 对象,因为它已经是一个。您可以像获取任何其他没有类型信息的 .NET 对象一样获取此对象的属性,例如:
var objectType = obj.GetType();
foreach(var prop in objectType.GetProperties())
{
Console.WriteLine("Property {0} of type {1}",
prop.Name, prop.PropertyType.Name);
}
要调用属性,您可以使用 Type 类的 InvokeMember 方法。以下是如何将对象上的“可见”属性(如果存在)设置为 true:
objectType.InvokeMember("Visible", BindingFlags.SetProperty,
null, obj, new object[] { true });
如果您使用的是 .NET 4 或 4.5,则可以使用 dynamic 关键字来更轻松地处理源自 COM 的 .NET 对象:
var xlAppType = Type.GetTypeFromProgID("Excel.Application");
dynamic xlApp = Activator.CreateInstance(xlAppType);
xlApp.Visible = true;
请注意,在最后一个示例中,Visible 属性的调用是如何免于使用咒语的。这些天来,我尝试尽可能使用动态来处理 COM 对象。
【讨论】: