2013-11-13 4 views
1

Я пытаюсь написать функцию, которая возвращает строку, представляющую тип объекта, выбранного в настоящее время в Excel.C# Определение типа выбранного объекта в Excel

Прямо сейчас, это то, что у меня есть:

public String GetExcelType(dynamic thing) 
{ 
    if(thing.GetType().GetProperty("ChartStyle") != null) 
    { 
     return "[CHART]"; 
    } 
    else if (thing.GetType().GetProperty("Cells") != null) 
    { 
     return "[TABLE]"; 
    } 

    return "[UNKNOWN]"; 
} 

А потом вызывается:

GetExcelType(oExcelApp.ActiveWindow.Selection); 

проблема, она возвращает "[Unknown]" каждый раз.

Далее запутывает проблему, выскакивает открыть сеанс отладки, мы можем ясно видеть, что объект обладает свойством в вопросе (в данном случае «клетка»):

enter image description here

Я вытащил dynamic.GetType().GetProperty("foo") немного от несколько других вопросов (все, похоже, согласны с тем, что это должно сработать), но, похоже, на флопе. Что я делаю не так?

+0

Можете ли вы просмотреть/опубликовать то, что находится в списке, который возвращается, если вы вызываете thing.GetType(). GetProperties()? AFAIK, есть только 2 способа сделать это: один из них - GetType (как вы это делаете), а другой пытается получить доступ к этому свойству и перехватывает исключение RuntimeBinderException, если он не работает. – Baldrick

+0

@Baldrick Может быть, я делаю это неправильно, но все, что мне кажется, может выйти из него: '{System.Reflection.PropertyInfo [0]}' –

ответ

2

Это, кажется, что вам нужно: http://fernandof.wordpress.com/2008/02/05/how-to-check-the-type-of-a-com-object-system__comobject-with-visual-c-net/

Тогда вы могли бы сделать что-то вроде:

public String GetExcelType(dynamic thing) 
{ 
    Type type = GetExcelTypeForComObject(thing) 
    if(type == typeof(Microsoft.Office.Interop.Excel.Chart)) 
    { 
     return "[CHART]"; 
    } 
    else if (type == typeof(Microsoft.Office.Interop.Excel.Range)) 
    { 
     return "[TABLE]"; 
    } 

    return "[UNKNOWN]"; 
} 
+0

Это довольно сложная функция. Неужели это сложный процесс? (Помня, что я полностью * наивный обо всем C#) –

+0

Согласен, что это сложно, но должно быть достаточно надежным – Iain

+0

Это сработало после того, как я заменил 'interop.Marshal ...' на 'System.Runtime.InteropServices.Marshal' , Я собираюсь потратить некоторое время, пытаясь упростить эту функцию для моих нужд. Я отправлю его обратно в вопросе, когда я это сделаю (предоставив общее решение). Благодаря! –

2

Вы можете найти эту функцию полезной для нахождения типа СОМ-объекта:

Microsoft.VisualBasic.Information.TypeName(oExcelApp.ActiveWindow.Selection) 
+0

'Информация', кажется, не существует для меня. Извините, я немного потерялся на земле C#. Я получил в этом проекте что-то вроде того, что я знаю, как работает весь пакет MS (я парень Java). Не могли бы вы немного поднять мою руку? –

+1

@SandyGifford Вы пытались добавить ссылку на Microsoft.VisualBasic.dll, щелкнув правой кнопкой мыши по папкам с вашими ссылками и выберите ссылку. В разделе Ассемблеры -> Рамки выберите Microsoft.VisualBasic. Теперь вы можете позвонить этому коду. –

+0

@SamPluPlus Это было бы отличным решением, если бы этот проект уже не страдал от тяжелого переплеска. Конечно, у меня есть +1. –

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