.NET - 可以自定义类型

本文关键字:自定义 类型 NET | 更新日期: 2023-09-27 18:30:05

在Delphi中,你可以做这样的事情:

TArray = array[1..3] of byte;

然后可以声明的位置

T2Array = array[1..3] of TArray

恶心...

.NET 中是否存在这样的东西?(VB,C#,随便什么(

我目前正在做这样的事情

Private LotsOfData As ObservableCollection(Of ObservableCollection(Of myClass))

但想做

Private LotsOfData As ObservableCollection(Of myType)

哪里

myType -->  ObservableCollection(Of myClass)

我知道你可以用结构来做到这一点,即:

Public Structure MyType
     Public myOc as ObservableCollection(Of MyClass)
End Structure
Dim LotsOfData as ObservableCollection(of MyType)

但是您必须将其引用为(例如(

LotsOfData.Last.myOc(i) 

而不是

LotsOfData.Last(i)

这似乎很笨拙。 这似乎也很笨拙:

For Each Data as ObservableCollection(of myClass) in LotsOfData
     DoSomething(Data)
Next

就像

For Each Data as MyType in LotsOfData
     DoSomething(Data.myOc)
Next

当它可能是

For Each Data as MyType in LotsOfData
     DoSomething(Data)
Next

有什么想法吗?

.NET - 可以自定义类型

如何定义从泛型集合的封闭类型派生的自定义类?例如:

public class MyType : ObservableCollection<MyClass>
{ }

然后,您可以创建另一个泛型集合,其类型参数是上面定义的类(它本身就是一个集合(:

ObservableCollection<MyType> lotsOfData = new ObservableCollection<MyType>();

当您迭代它时,您将获得内部集合的序列:

foreach (ObservableCollection<MyClass> data in lotsOfData)
{
    DoSomething(data);
}

编辑:如上所示的派生将允许您从基ObservableCollection<T>类继承所有可访问的成员,但您将无法调用其(非默认(构造函数。因此,您通常需要实现与基类具有相同重载的构造函数:

public class MyType : ObservableCollection<MyClass>
{
    public MyType()
        : base()
    { }
    public MyType(IEnumerable<MyClass> collection)
        : base(collection)
    { }
    public MyType(List<MyClass> list)
        : base(list)
    { }
}

看起来您正在尝试在代码中创建类型别名。 VB.Net 确实以Imports指令的形式支持这一点

Imports myType = System.Collections.Generic.ObservableCollection(Of myClass)
...
Private LotsOfData As ObservableCollection(Of myType)

注意:必须对要使用 myType 的每个文件重复 Imports 指令。

您可以在 .Net Delphi 语言 Oxygene 中定义类型别名。与经典德尔菲相同的语法。

type
  MyType = ObservableCollection<MyClass>;

可以使用 public 使名称在其他程序集中可见。

从 IEnumerable 开始,其中 T 是你正在操作的类型。 有许多实现,包括List<T>,它允许您轻松排序,推送和弹出元素。

例如。。。

var myListOfThings = new List<Thing>(); 
myListOfThings.Add(new Thing {Name = "Green thing" }); 
myListOfThings.Add(new Thing { Name = "Red thing" }); 
myListOfThings.Add(new Thing { Name = "Yellow thing" });

当使用IEnumerable时,你可以访问LINQ...

var redThing = myListOfThings.FirstOrDefault(x => x.Name == "Red Thing");

和简单的迭代...

foreach(var thing in myListOfThings)
{
     // do something
}

注意:我没有任何 VB 示例,但您使用 C# 标记了问题,所以我希望这些示例有用。