2014-10-06 146 views
1

我有一個類包含一些公共xxx作爲List(Of someType)。這在我們的代碼中廣泛使用。不幸的是,我還需要將這些列表作爲ArrayList提供,因爲我們需要可以在VBA中訪問相同的對象(專門用於Excel)。我可以繼承一個類來爲泛型提供互操作嗎?

我所熟悉的抽象和超控/新的,但是這將意味着改變的代碼,這已經實現了一個一大堆,而且,我的眼睛,創造了額外的代碼很多(有可能的50這些東西)來抽象出對象,事實上這是99%的時間使用的情況。

這裏的基本問題......

public class cProp 
    private Eyes as List(Of Integer) 
    public property Eyes as List(Of Integer) 
     'get and set that does a lot of work 
    end property 
    'repeat 50 times 
end class 

幾乎所有的我們的代碼使用cprop可這麼寫,有沒有別的好像它做什麼,但引入錯誤50項抽象基類。所以理想情況下,我想要像...

<ClassInterface(ClassInterfaceType.AutoDual)> 
public class dProp 
    inherits cProp 
    public readonly property **something** Eyes as ArrayList 
     'convert List to ArrayList 
    end property 
end class 

如果這樣的事情存在,我還沒有弄清楚。

+0

簡單地添加一個單獨的只讀屬性的負載EyesArray等,提供了現有的道具ArrayLists的缺點是什麼? – tolanj 2014-10-06 19:14:01

+1

從不公開實現,COM客戶端只使用接口。在這種情況下System.Collections.IList。爲它找到一個實現很簡單,List <>實現它。 – 2014-10-06 19:32:38

+0

@tolanj,我可以有兩個屬性只在返回類型中有所不同嗎?我認爲他們必須在*參數*上聚合,特別是在編譯器不知道返回類型的COM中? – 2014-10-06 19:48:15

回答

2

這是不可能的。 COM不支持泛型,調用通用接口或類(直接或間接)將導致錯誤E_NOINTERFACEHere's定義類型時interopability你可能不什麼:

  • 訪問的通用接口從COM。
  • 訪問從泛型類派生的非泛型類的類接口。
  • 爲泛型類生成類接口。例如,不能爲Foo<Bar>類生成_FooBar接口。

雖然你的.NET實現可以使用泛型類型,你只能夠暴露非通用版本的COM。 Instability of IEnumerable<int> or IList<int> to COM,讓你的類接口繼承IList而不是(或者用它作爲屬性類型)。該接口與COM兼容,並且通用版本實現它,因此您可以在.NET端保持類型安全並使用COM的非通用版本。

+0

謝謝你。我在界面上顯然有很多閱讀需要做! – 2014-10-07 19:53:13