换句话说:
是否有充分的理由选择松散类型的集合而不是类型安全的集合(HashTable vs. Dictionary)?它们是否仅用于兼容性?
据我所知,通用集合不仅类型安全,而且性能更好.
这是一篇关于该主题的综合文章:使用C#2.0对数据结构进行广泛的检查.
这是我之前的问题的后续内容,但您不需要阅读它来理解那个问题.
我正在设计.NET中的接口,它将从COM应用程序(主要是VB6,但Visual C++ 6也是一种可能性)中使用,我想使用Collection类型作为接口中方法的参数和返回类型.
问题:
当VB6内置集合类型(数组,集合,字典)通过互操作时会发生什么?我目前的猜测是:
System.ArrayMicrosoft.VisualBasic.CollectionSystem.Collections.Hashtable那是对的吗?
IEnumerable,ICollection,IList,IDictionary?我是否能够在VB6中执行For Each迭代这些接口?我应该使用接口的通用或非通用变体吗?我注意到,如果我创建一个公开ArrayList的.NET组件,那么该ArrayList将通过COM Interop并以脚本语言(如VBScript)提供.
泛型,如IList<T>似乎没有工作.
为什么这样,是否有任何方法可以使通用类型成功地通过COM Interop流向脚本引擎?
好吧,我想在VBA中使用几个.NET类.所以我必须通过COM注册它们.我想我已经找到了COM注册(最后),但现在我需要有关如何创建对象的语法的帮助.这是一些伪代码,显示了我想要做的事情.
编辑:更改附加对象以返回ArrayList而不是List
.NET类看起来像这样......
public class ResourceManagment
{
public ResourceManagment()
{
// Default Constructor
}
public static List<RandomObject> AttachedObjects()
{
ArrayList list = new ArrayList();
return list;
}
}
public class RandomObject
{
//
public RandomObject(int someParam)
{
}
}
Run Code Online (Sandbox Code Playgroud)
好的,这就是我想在VBA中做的事情(用C#演示),但我不知道怎么做......
public class VBAClass
{
public void main()
{
ArrayList myList = ResourceManagment.AttachedObjects();
foreach(RandomObject x in myList)
{
// Do something with RandomObject x like list them in a Combobox
}
}
}
Run Code Online (Sandbox Code Playgroud)
需要注意的一点是RandomObject没有公共默认构造函数.所以我无法创建它的实例Dim x As New RandomObject.MSDN说你不能通过COM实例化一个没有默认构造函数的对象,但是如果它被另一个方法返回,你仍然可以使用它.Types …
``
我有一个 C# 类库项目 (.Net Framework 4.5),我在 VB6 中将其用作类型库 (.tlb)。
对于将非集合对象作为属性或返回的属性,一切都可以正常工作。
据我所知,不可能公开用户类型对象的集合(数组/列表)(例如Product []在 C# 项目中)并将其导出到 tlb 文件,但Object []我听说这是可以的。所以,我改变了:
Public List<Product> ListOfProducts( get; set; )
Run Code Online (Sandbox Code Playgroud)
到
Object [] _productList;
public Object [] ListOfProducts
{
get
{
return _productList;
}
set
{
_productList = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
public void SetListOfProducts(Object [] products)
{
_productList= products;
}
Run Code Online (Sandbox Code Playgroud)
完成后,ListOfProducts或者SetListOfProducts现在在 Visual Basic 6 项目中可见,但在 VB6 中,当我运行时:
Private Sub Command1_Click()
Dim Sell as new SellProducts
Dim …Run Code Online (Sandbox Code Playgroud) 我们有一个用C#.Net 2.0编写的小框架,我们想要向COM公开.
问题是,我们有一些通用类,将公开如下:
interface IOurClass
{
ReadonlyCollection<IOurListObject> OurCollection
{
get;
}
}
interface IOurListObject
{
//Some properties that don't matter
}
Run Code Online (Sandbox Code Playgroud)
将通用集合暴露给COM的最佳(或推荐方法)是什么?我们不必支持泛型,我们只需要以某种方式公开IOurListObject的集合.
我们也希望避免为我们使用的每个集合编写一个新类,但它可能是不可能的.
.net ×4
com-interop ×3
generics ×3
c# ×2
com ×2
vb6 ×2
collections ×1
generic-list ×1
scripting ×1
vba ×1