首页
学习
活动
专区
圈层
工具
发布

在C++中反射调用.NET(三) 使用非泛型集合的委托方法C++中的列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

,好在IEnumerableT>也是继承 IEnumerable 的,所以可以当做非泛型对象在C++中访问,因此创建上面的委托方法是可行的。...+/CLI写法却无法通过编译: Type^ t=List::typeid; VS总是提示List缺少类型参数,不过像下面这样子是可以的: Type^ t2= List::typeid...反射调用索引器 SOD实体类可以通过索引器来访问对象属性,例如下面的C#代码: int id=(int)CurrEntity["ID"]; CurrEntity["Name"]="张三"; string...name=(string)CurrEntity["Name"];//张三 下面,我们研究如何通过索引器来给实体类的属性赋值: 我们定义一个 EntityHelper的C++/CLI类,在中间添加下面的代码...//this->idxAction(propName, value); } 对索引器的访问,实际上就是调用类的 set_Item 方法,VS编译器会给包含索引器的对象生成这个方法,一般来说我们会对要反射调用的方法创建一个委托

10.1K100

.NET面试题系列 - IEnumerable的派生类

IListT> IListT>全部是关于定位的:它提供了一个索引器,InsertAt和RemoveAt(分别与Add,Remove相同,但可以指定位置),以及IndexOf。...最常见的实现了IListT>的数据结构是ListT>。但其并不是链表。它的内部实现是数组。靠链表实现的数据结构是LinkedListT>。 ListT> 在大多数情况下,这都是默认的列表选择。...双向链表LinkedListT>: 插入:O(1) (在头尾部),O(N) (在其他位置) 删除:O(1) (在头尾部),O(N) (在其他位置) 按照索引器访问:没有索引器(因为没有实现IList和值。但SortedList公开的键和值的集合都实现了IListT>,所以可以使用排序的键索引器有效的访问条目。...不继承自IListT> 没有索引器 DictionaryT, K> 键值对 IDictionaryT> HashTable的泛型版本 IListT> 索引器 ICollectionT>

2.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MessagePack for C# (.NET Framework, .NET 8, Unity, Xamarin)

    它类似于 JSON,但通过二进制编码实现了更小的数据体积和更快的序列化/反序列化速度。 MessagePack for C# 这是一个为C#设计的极快的MessagePack序列化器。...性能很重要,尤其是在游戏、分布式计算、微服务或数据缓存等应用中。 性能比较图 MessagePack具有紧凑的二进制大小和完整的通用表达数据类型集。...这可以通过对象序列化部分和格式解析器部分中的详细信息使其可选。 内置支持的类型 默认情况下,这些类型可以序列化: • 原始类型 (int, string 等...)...• 具有无参构造函数的IList或IDictionary的自定义实现 对象类型序列化 StandardResolver 和 ContractlessStandardResolver 可以序列化 object...ZeroFormatter 和 FlatBuffers 有无限快的反序列化器,所以忽略它们的反序列化性能。

    30510

    数据结构与算法2016-06-03

    接口 通用语言运行时(clr)支持单实现继承和多接口继承。 单实现继承是指一个类型只能有一个基类型。...另外可以在任何时候通过开发附加接口和实现来添加新的功能。 关于接口的很重要的概念是接口只包含成员定义,不包含成员的实现。接口仅仅是一个包含着一组虚方法的抽象类型。...成员的实现需要在继承的类或者结构中实现。接口的成员包括静态方法、索引器、常数、事件以及静态构造器等,不包含任何实例资源或实例构造器,所以,不能实例化一个接口。...IDictionary接口实现是键值对的集合,如Hashtable类。 (6)IList接口 IList接口实现是可被排序且可按照索引访问其成员的值的结合,如ArrayList类。...5.接口的实现 接口的实现分为隐式实现和显式实现。如果类或结构要实现的是单个接口,可以使用隐式实现,如果类或者结构继承了多个接口,那么接口中相同名称成员就要显式实现。

    43820

    C#学习笔记 常用的集合

    列表ListT> 列表ListT>实现了IList、ICollection、IEnumberable、IList接口。可以向该列表中动态的添加、删除、查找元素。...列表实现了IList接口,而IList接口中实现了索引器。因此列表可以直接使用索引器访问元素,就像数组一样。 可以用Count属性查看列表有多少个元素。...重载的Sort()方法可以添加一个比较器, 以实现自定义排序。 可以使用ConvertAll()方法,将一种类型的列表转换为另外一种类型的列表。...队列QueueT> 队列也就是先进先出(FIFO)的列表,队列实现了ICollection和IEnumberableT>接口,但是没有实现ICollectionT>接口,因此没有Add()和...也没有实现IListT>接口,因此不能使用索引器访问。

    44910

    .NET中的泛型集合

    引用类型的数组通常是协变的;如Stream[]引用可以隐式转换为Object[],并且存在显式的反向转换(容易混淆的是,也可以将Stream[]隐式转换为IList,尽管IList本身是不变的)。...LinkedList在很多方面都是一个列表,特别的,它是一个保持项添加顺序的集合——但它却没有实现IList。因为它无法遵从通过索引进行访问的隐式契约。...尽管LinkedList实现了Add等标准方法(向链表末尾添加节点),我还是建议使用显式的AddFirst和AddLast方法,这样可以使意图更清晰。...它们仍然实现了泛型和非泛型的集合接口。并且混合使用了显式和隐式的接口实现,这样使用具体类型的编译时表达式的调用者将无法使用变动操作。...此外,IReadOnlyList的协变性意味着它不能暴露任何以T为参数的方法,如Contains和IndexOf。其最大的好处在于它暴露了一个索引器,通过索引来获取项。

    1.2K20

    vector 的六种 创建和初始化方法「建议收藏」

    C++的初始化方法很多,各种初始化方法有一些不同。...(1): vector ilist1; 默认初始化,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。...类型相同,也就是同为int的vector类型,ilist2将具有和ilist相同的容量和元素 (3): vector ilist = {1,2,3.0,4,5,6,7}; vector ilist3(ilist.begin()+2,ilist.end()-1); ilist3初始化为两个迭代器指定范围中元素的拷贝,范围中的元素类型必须与ilist3 的元素类型相容...(5): vector ilist4(7); 默认值初始化,ilist4中将包含7个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此ilist4被初始化为包含7个0。

    4K30

    C++ Primer 第11章 泛型算法 学习总结

    11.3 迭代器 11.3.1 插入迭代器 a. back_inserter–使用push_back实现的插入迭代器 b.front_inserter–使用push_front实现插入,若容器不支持push_front...in; istream_iterator 对象的超出末端迭代器 ostream_iterator in(strm); 创建将 T 类型的对象写到输出流 strm 的ostream_iterator 对象...(前向迭代器) 读和写;只支持自增运算 Bidirectional iterator(双向迭代器) 读和写;支持自增和自减运算 Random access iterator(随机访问迭代器) 读和写;支持完整的迭代器算术运算...ostream_iterator 则实现写输出流的功能,无需要考虑所写的元素个数。 b. 带第二个输入序列的算法 算法同时使用 beg2 和 end2 时,这些迭代器用于标记完整的第二个范围。...lst.splice(iter, beg, end) 第三版本移动迭代器 beg 和 end 标记的范围内的元素。beg 和 end 必须指定一个有效的范围。

    1.2K10

    三十分钟掌握STL

    尽管你的编译器可能没有实现名字空间,你仍然可以使用他们。...迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值。例如,一个数组索引,也可以认为是一种迭代器。 迭代器有各种不同的创建方法。...容器迭代器 尽管C++指针也 是迭代器,但用的更多的是容器迭代器。容器迭代器用法和iterdemo.cpp一样,但和将迭代器申明为指针变量不同的是,你可以使用容器类方法来获取 迭代器对象。...Fibonacci 发生器封装在一个类中,该类能从先前的“使用”中记忆运行结果。在本例中,类FiboRand 维护了一个数组和两个索引变量I和j。...最近,C++标准委员会采纳了STL,尽管在不同的实现之间仍有细节差别。 STL的最主要的两个特点:数据结构和算法的分离,非面向对象本质。

    2.6K80

    c#数组简单知识补充

    ,有索引器,查询元素位置,插入数据,移除索引位置数据这个方法,简单的可以当作存放数据的容器,不能像List那样具有很多数据处理的方法。...定义比较能力,数组可以比较数组是否具有相同的内容 如果元素数量不同直接返回不相等,同时具有几个元素就会执行几次比较 System.Collections.IStructuralEquatable // 也提供了索引器...,删除插入查询数据几个方法,但是是泛型数据 /* 特殊的,所有的数组默认继承自Array抽象类,该类实现了如上的接口,但在查看源码不能看到数组实现如下接口,这些接口实在CLR动态为一维数组实现如下的接口...*/ System.Collections.Generic.IList T> // 提供泛型的能力,也有基本的增删改查的功能 System.Collections.Generic.ICollection...T> // 只读集合,通过索引访问该只读集合的元素 System.Collections.Generic.IReadOnlyCollection T> 代码查看: foreach

    37910

    通过运行期类型检查实现泛型算法

    但是这里存在一个问题,大部分序列都支持随机访问,那么如果输入的序列支持 IList 这种写法就是多此一举,因为这种写法会创建出一份和源序列一摸一样的序列。...IList 的构造函数,是因为只有参数的编译器类型是 IList 的时候新的构造函数才会生效。...一、第二次优化 上述代码基本上囊括了大部分情况,但有时我们还会遇到一些集合只实现了 ICollection 而没有实现 IList 的情况,这种情况下我们代码中的 GetEnumerator 方法性能就不是很高了...但是当 T 是 string 时性能就会大打折扣,因为我们的代码本身并没有实现 IList ,因此我们需要在泛型类中编写更具体的代码才能解决这个问题,我们需要在 DemoEnumerable 类中加入如下的嵌套类...,但是我们需要在算法的效率和泛型的复用程度之间找到平衡点。

    84410

    WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)

    有的集合要求元素具有相同的类型,这种集合一般通过泛型的方式定义,它们实现另一个接口IEnumerableT>(IEnumerableT>本身继承自IEnumerable),这样的集合有ListT>...实际上,如果你在定义服务契约的时候,将某个服务操作的参数类型设为IEnumerableT>或者IList>,默认导出生成的服务契约中,相应的参数类型就是数组类型。...>表示也具有等效性,我们能否让数组类型变成IListT>类型呢,毕竟从编程角度来看,它们还是不同的,很多时候使用IListT>要比直接使用数组方便得多。...图3 缺少Add方法导致的序列化异常 3、简化自定义集合数据契约定义 为了演示默认构造函数和Add方法对于集合数据契约的必要性,再定义CustomerCollection的实现,仅仅是实现了IEnumerable...、IList、IListT>,还是现在介绍的Hashtable和IDictionary,最终序列化的都是ArrayOfXxx。

    1.9K70

    金三银四面试:C#.NET面试题中高级篇3

    IList 接口与List的区别是什么? IList 泛型接口是 Icollection 接口的子代,并且是所有非泛型列表的基接口。Ilist 实现有三种类别:只读、固定大小、可变大小。...无法修改只读 Ilist。固定大小的 Ilist 不允许添加或移除元素,但允许修改现有元素。可变大小的 Ilist 允许添加、移除和修改元素。...IList 是个接口,定义了一些操作方法这些方法要你自己去实现,当你只想使用接口的方法时,这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间....而 IList IList11 =new List (); 只是想创建一个基于接口IList的对象的实例,只是这个接口是由List实现的。所以它只是希望使用到IList接口规定的功能而已。...泛型的约束分为:主要约束和次要约束,它们都使实参必须满足一定的规范,C#编译器在编译的过程中可以根据约束来检查所有泛型类型的实参并确保其满足约束条件。

    1.8K40
    领券