2014-09-10 13 views
4

Я делаю программу, и я хочу сделать Reflection, но для этого мне нужен объект класса Type, правильно? использовать .GetProperties (метод) ... Так я судимое это:Как вернуть тип системы .__ COMObject в System.Type в C#

Type typeName = simObjects.getType();

Но .GetType() возвращает "System .__ ComObject". И это не полезно. То же самое происходит с .typeof(). Я поиск и нашел еще один код, это один:

Type typeName = (Type)Microsoft.VisualBasic.Information.TypeName(simObjects);

Но этот метод возвращает строку, и мне это нужно в System.Type, Может ли гениальная, пожалуйста, помогите мне?

+0

COM не поддерживает отражение. –

+0

http://www.add-in-express.com/creating-addins-blog/2011/12/20/type-name-system-comobject/ – MethodMan

+0

@HansPassant Вы можете использовать CustomMarshaler для преобразования COM ITypeInfo (доступно на COM-объектах, реализующих IDispatch), в .NET Reflection Type, как показано в [этом ответе] (http://stackoverflow.com/a/14208030/3175562) и [этот проект] (http://www.codeproject.com/Статьи/523417/Reflection-с-IDispatch основе-COM-объекты). – Mike

ответ

2

Ну, я знаю его конце answear, я решить мою проблему некоторое время назад я отвечу, надеюсь, что это может помочь кому-то.

Я не использовал reflextion, как я хочу, но его работа очень хорошая.

foreach(PropertyDescriptor descrip in TypeDescriptor.GetProperties(COMObject)) 
{ 
    if(descrip.Name == "Attribute Name") 
    { 
     foreach(PropertyDescriptor descrip2 in TypeDescriptor.GetProperties(descrip)) 
     { 
      if(descrip2.Name == "sub attribute Name") 
      { 
      } 
     } 
    } 
} 

Этот код возвращает имя атрибуты, например, представить себе, что мой ComObject есть это атрибуты:

int age; 
string name; 
Son Phill; 

и сын:

int age; 
string name; 

в первом цикле, descrip.Name будет «age», «name» и «Phill», а во втором (предположим, что condiiton возвращает true с «Son»), «age» и «name».

Надеюсь, это поможет кому-то.

0

Смотрите эту ссылку о том, как получить тип:

http://support.microsoft.com/kb/320523

Посмотрите этот SO ответ относительно COM-объектов и отражение:

https://stackoverflow.com/a/10617479/4004002

Кроме того, вы знаете, что свойства впереди? Если это так, вы можете (я никогда не пробовал его с COM-объектом) иметь возможность использовать Dynamics вместо этого для доступа к свойствам.

dynamic d = simObjects; 
string myVariable = d.SomeProperty; 

EDIT: Эта ссылка объясняет, используя динамику и COM

http://msdn.microsoft.com/en-us/magazine/ff714583.aspx

В случае, если она исчезает:

public static class WordDocument 
{ 
    public const String TemplateName = @"Sample.dotx"; 
    public const String CurrentDateBookmark = "CurrentDate"; 
    public const String SignatureBookmark = "Signature"; 

    public static void Create(string file, DateTime now, String author) 
    { 
     // Run Word and make it visible for demo purposes 
     dynamic wordApp = new Application { Visible = true }; 

     // Create a new document 
     var doc = wordApp.Documents.Add(TemplateName); 
     templatedDocument.Activate(); 

     // Fill the bookmarks in the document 
     doc.Bookmarks[CurrentDateBookmark].Range.Select(); 
     wordApp.Selection.TypeText(current.ToString()); 
     doc.Bookmarks[SignatureBookmark].Range.Select(); 
     wordApp.Selection.TypeText(author); 
+0

Я видел эту ссылку, не помогал, пример помогает только с Excel, и я не делаю nothig для excel ...= ( – Jovita

+0

Такая же методика может быть применена к любому типу объекта, если вы знаете, какие свойства вызываются. Динамические свойства оцениваются во время выполнения. Просто назначьте свой COM-объект динамическому и получите доступ к его свойствам так же, как и любой POCO – DVK

+0

Я читаю эти ссылки, я не уверен, если это поможет, но спасибо в любом случае – Jovita

Смежные вопросы