首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用泛型委托,构筑最快的通用属性访问器

最近做一个父类的属性向子类的属性赋值的小程序,用了下AutoMapper组件,感觉不错,想探究下它的原理,自己动手做一个例子试试看。...实现这个功能,第一反应使用反射遍历对象的属性然后获取父类对象的属性值,接着设置给子类对象同名的属性。但一想到反射的效率,就又打算才用另外的方式来实现。...,改写成泛型方法了: 首先,定义一个获取属性值和设置属性值的泛型委托: public delegate T GetPropertyValue(); public delegate void SetPropertyValue...这个测试中字典元素的数量是较少的,有朋友提示,可能是计算字典的Key的哈希耗费了较多性能,于是将缓存字典的长度改小成DGP-{0}-{1} 和 DSP-{0}-{1},再次进行测试: =========...obj 有效,除非这是静态属性,它并不能作为一个通用类型的属性访问器,所以将它缓存意义不大,但可以作为优化属性访问的一个手段。

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

    C#中的泛型(类型参数的约束)

    首先,来看一个程序,对泛型有一个初步的认识。...因为我们的数组中存储的元素类型是不确定的,所以这里我们用到了泛型,其中where T : strut子句约束参数类型T必须为值类型。当然这个程序我们不使用泛型,直接定义Object类型的数组也可以。...下面重点说说C#中泛型类型参数的约束: 在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。 如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。...于是,我想能不能写一个简单的泛型类,其中里面实现对数值类型的加减乘除四则运算,遇到的问题是 :where子句后面的约束怎么写,我查看的数值型的类Int32等等,它们的基类是Object,如果直接定义一个泛型参数...最后,在MSDN上找了找资料,发现C#中时没办法实现的。 如果有朋友,发现了解决问题的方法,请分享下!愿共同学习!

    3.7K60

    【说站】java泛型中类型擦除的转换

    java泛型中类型擦除的转换 说明 1、泛型值存在于编译阶段,当代码进入虚拟机时,泛型值将被删除。 2、这个特征被称为类型删除。当泛型被删除时,他有两种转换方法。...第一种是,如果泛型没有设置类型上限,泛型将转换为Object类型,第二种是如果设置了类型上限,泛型将转换为其类型上限。...getT() {         return t;     }     public void setT(T t) {         this.t = t;     } } //通过反射调用获取他们的属性类型...:" + field.getName() + "的类型为:" + field.getType().getName());     }       Test2 test2 = new Test2();     ...:" + field.getName() + "的类型为:" + field.getType().getName());     } } 以上就是java泛型中类型擦除转换的方法,希望对大家有所帮助。

    1.2K20

    当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢

    事情是这个样子的...... 对话中的截图如下: 看了阿Q的解释,你是否也和“马小跳”一样存在疑问呢?请往看 我们都知道在java中,只要是类型兼容,就可以将一种类型的对象分配给另一种类型的对象。...那么问题来了,当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢?例如如何让Box 和Box变得与Box有关呢?...因此当我们在传递参数时,ArrayList类型的是可以给List或者Collection传递的。 只要不改变类型参数,类型之间的子类型关系就会保留。...小结:可以通过继承泛型类或者实现接口来对其进行子类型化。 搞懂了子类型化的问题,我们回到“如何在两个泛型类之间创建类似子类型的关系“的问题。...泛型类或者接口并不会仅仅因为它们的类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建泛型类或接口之间的关系。

    2.9K20

    C# 泛型中的数据类型判定与转换

    提到类型转换,首先要明确C#中的数据类型,主要分为值类型和引用类型: 1.常用的值类型有:(struct) 整型家族:int,byte,char,short,long等等一系列 浮点家族:float,double...当然了,无论是装箱和拆箱,对于性能都是有消耗的,不到万不得已的时候尽量不要用(虽然我才不管这些,只要我用的爽就行了233) 虽然一般不提倡用object类型作为函数参数,取而代之使用泛型成为首选,那么如何判断泛型参数的具体数据类型并进行有效转换呢...」的结构体,包含标签,具体值和属性类别(是主属性还是副属性),并使用泛型约束数据为值类型。...现在想要快速对这个结构体进行加法操作,于是增加操作符重载函数,方便愉快的对两个属性的值相加,但问题是泛型是无法强转为任何一种非object数据类型,直接相加则更是不可能。....Net 4.0 以后开始支持动态数据类型——也就是dynamic关键字;令人兴奋的是,dynamic可以被赋值为任何一种类型的值,当然也包括泛型。

    3.7K30

    IRIS Chronicles 中的 Data Type(数据类型)字段型属性

    IRIS 的数据类型比较少,也就 4 个数据类型:字符串,数字,时间,分类。在这里分类有点像我们的下拉选择框,其实对应 Java 或者其语言中的数据来说可以说是枚举类型。...只是 IRIS 的枚举类型是定义在数据库中的,并且是事先定义好的。String这个好说,就是字符串。...因为 M 语言的限制,所以 String 字符串中可以存储的字符最多为 32KB、Number数字,这个数字可以是整数也可以是浮点数。...IRIS 对存储的数据库如果有没有意义的 0 的话,数据库会对这个数字进行处理,删除掉没有意义的 0。例如数据 “0900.0100” 将会被实际存储为 “900.01”。...这个是系统自动生成的系统时间,通常不需要我们认为的手动输入。Category 分类这个就是我们说的分类了,在这个分类中我们可以想象为数据库中预先存储的枚举类型。比如说人的性别,我们通常会预定义好。

    11410

    C#中的泛型约束:如何利用泛型约束来提高代码的类型安全性和灵活性?

    泛型约束是指可以对泛型类型参数进行限制,只允许特定类型或满足特定条件的类型作为泛型参数。...使用泛型约束可以提高代码的类型安全性和灵活性,以下是一些常见的泛型约束及其作用: 类型约束(class constraint):使用 where T : class 约束可以确保泛型参数必须是引用类型...这可以在泛型方法中使用接口的方法和属性,而无需知道具体的实现类。...基类约束(base class constraint):使用 where T : 基类名称 约束可以确保泛型参数必须是指定基类的派生类。这可以确保泛型参数具有特定的行为和属性。...通过使用这些泛型约束,可以在编译时捕获潜在的类型错误,并提供更好的类型安全性。同时,约束也提供了更灵活的代码设计,可以根据特定的约束条件编写更通用、可复用的代码。

    8110

    java泛型:通过自定义ParameterizedType实现参数化类型中类型参数的替换

    需求说明 如果要动态构造一个泛型参数对象(ParameterizedType),guava提供的TypeToken工具可以部分实现这个功能: 比如下面这个例子(来自guava wiki TypeToken...),可以根据需要定制一个指定K,V类型的Map。...别逗了,还真打算从头自己写一个啊,再说自己的写的敢用么? 直接把jdk中的ParameterizedTypeImpl代码抄来改改就可以啦 其实这个问题我也是琢磨了好长时间才想通的。...完整代码如下(中文注释部分是我增加的方法),代码中用到了guava中的TypeToken工具类实现,只是为了少写些代码。...} sb.append(">"); } return sb.toString(); } /** * 将当前对象的类型参数中为

    4.8K80

    【Rust每周一知】Rust 中 trait、关联类型与泛型配合的常见模式

    Rust 中,trait,关联类型,泛型,这几个概念本身并不复杂。但是这些东西合在一起使用的时候,经常让初学者感觉天花乱坠,摸不着头脑。...("output is: {}", output); } 输出: output is: 42 trait 中的泛型参数 其实使用泛型也可以做到类似的效果。...trait 中的泛型与关联类型,有如下区别: 如果 trait 中包含泛型参数,那么,可以对同一个目标类型,多次 impl 此 trait,每次提供不同的泛型参数。...而关联类型方式只允许对目标类型实现一次。 如果 trait 中包含泛型参数,那么在具体方法调用的时候,必须加以类型标注以明确使用的是哪一个具体的实现。...而关联类型方式具体调用时不需要标注类型(因为不存在模棱两可的情况)。 trait 中的泛型参数 + 默认类型 泛型参数是可以指定默认类型的,在 trait 的定义中也不例外。

    1.9K20

    根据java编译器规则在Class中搜索匹配指定参数类型表的泛型方法(GenericMethod)

    因为项目的需要,设计了一个满足特定需要的代码自动生成工具。在开发过程中需要根据方法名和方法参数类型数组在指定的类中根据java编译器的规则找到与之最匹配的泛型方法。...void test(int a,URL b,T c){ } public void test(T1 a,T2 b,T3 c){ } } 于是对java关于泛型方法匹配的方式做了研究...,发现java编译器在匹配泛型方法时,对参数的匹配是遵循从左到右的顺序来一个个检查的,根据这个规则写了下面的方法来实现泛型方法的精确匹配。.../** * @param clazz 要搜索的类 * @param name 方法名 * @param parameterTypes 希望匹配的参数类型数组 *...类的映射表 private static final Map<Class<?

    1.6K30

    【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )

    文章目录 一、ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 二、完整代码示例及进行编译时处理的编译过程 1、Groovy 脚本 Groovy.groovy...#visit 方法中访问 Groovy 类、方法、字段、属性 ---- 在 ASTTransformation#visit 方法中 , 使用 source.AST 可以获取 Groovy 脚本的 AST...语法树节点 , 该节点是 ModuleNode 类型的 , 在一个 Groovy 脚本中可以定义多个 Class 类 , 其对应的 Class 语法树节点封装在了 ModuleNode 类的 List...ClassNode 类型的集合元素 ; source.AST.classes.each { it } 遍历时 , 执行 ClassNode 对象的 visitContents 方法 , 传入 GroovyClassVisitor...对象 , 用于访问 Groovy 的每个类 ; GroovyClassVisitor 对象中 , 提供了访问 类 、成员字段 、成员方法 、属性 、 构造函数的回调方法 ; 代码示例 : import

    89720

    优雅的在 react 中使用 TypeScript

    在 react 中使用 ts 的几点原则和变化 所有用到jsx语法的文件都需要以tsx后缀命名 使用组件声明时的Component泛型参数声明,来代替PropTypes!...: readonly state = {} as IState; } 复制代码 ts 断言参考资料 需要特别强调的是,如果用到了state,除了在声明组件时通过泛型参数传递其state结构,还需要在初始化...没错,实际情况确实是这样的,但是这样子做其实是让组件丢失了对state的访问和类型检查!...就是将高阶组件注入的属性都声明可选(通过Partial这个映射类型),或者将其声明到额外的injected组件实例属性上。...利用泛型和类型推导,我们对高阶组件返回的新的组件以及接收的参数组件的props都做出类型声明。

    2.7K10

    TS 进阶 - 类型工具

    工具类同样基于类型别名,只是多了个泛型。...在类型别名中,类型别名可以声明自己能接受泛型,一旦接受了泛型,就称他为工具类型: type Factory = T | number | string; 虽然变成了工具类型,但其基本能力仍然是创建类型...,只不过工具类型能够接受泛型参数,实现更灵活的类型创建功能。...boolean; } 索引签名类型常见场景是在重构 JavaScript 代码时,为内部属性较多的对象声明一个 any 的索引类型签名,以此来暂时支持对类型未明确属性的访问,并在后续中逐渐补全类型...类型工具 创建新类型的方式 常见搭配 类型别名 将一组类型/类型结构封装,作为一个新的类型 联合类型、映射类型 工具类型 在类型别名的基础上,基于泛型去动态创建类型 使用类型工具 联合类型 创建一组类型集合

    89220

    深入学习下 TypeScript 中的泛型

    但由于数据类型未知,这段代码将无法访问对象的属性。如果您不打算将特定类型添加到泛型函数的每次调用中,则可以将默认类型添加到泛型类型参数中。...这意味着 TypeScript 会将数据识别为具有字符串类型的键和任意类型的值的对象,从而允许您访问其属性。类型参数约束在某些情况下,泛型类型参数需要只允许将某些形状传递给泛型。...接下来,您将进一步探讨本教程中已经多次出现的主题:使用泛型创建映射类型。使用泛型创建映射类型在使用 TypeScript 时,有时您需要创建一个与另一种类型具有相同形状的类型。...这意味着它应该具有相同的属性,但属性的类型设置为不同的东西。对于这种情况,使用映射类型可以重用初始类型形状并减少应用程序中的重复代码。在 TypeScript 中,这种结构被称为映射类型并依赖于泛型。...结论在本教程中,我们探索适用于函数、接口、类和自定义类型的泛型,以及使用了泛型来创建映射类型和条件类型。 这些都使泛型成为您在使用 TypeScript 时可以随意使用的强大工具。

    17710

    深入学习下 TypeScript 中的泛型

    但由于数据类型未知,这段代码将无法访问对象的属性。 如果您不打算将特定类型添加到泛型函数的每次调用中,则可以将默认类型添加到泛型类型参数中。...这意味着 TypeScript 会将数据识别为具有字符串类型的键和任意类型的值的对象,从而允许您访问其属性。 类型参数约束 在某些情况下,泛型类型参数需要只允许将某些形状传递给泛型。...将泛型与接口、类和类型一起使用 在 TypeScript 中创建接口和类时,使用泛型类型参数来设置结果对象的形状会很有用。 例如,一个类可能具有不同类型的属性,具体取决于传递给构造函数的内容。...接下来,您将进一步探讨本教程中已经多次出现的主题:使用泛型创建映射类型。 使用泛型创建映射类型 在使用 TypeScript 时,有时您需要创建一个与另一种类型具有相同形状的类型。...结论 在本教程中,我们探索适用于函数、接口、类和自定义类型的泛型,以及使用了泛型来创建映射类型和条件类型。 这些都使泛型成为您在使用 TypeScript 时可以随意使用的强大工具。

    39K30

    深入理解 TypeScript 中的 Keyof 运算符,让你的代码更安全、更灵活!

    一、如何定义 KeyOf 运算符 在 TypeScript 中,keyof 运算符用于获取用户定义的值。它主要用于泛型,格式类似于联合运算符及其属性。keyof 运算符会检索用户指定的值的索引。...二、在泛型中使用 KeyOf 运算 使用 KeyOf 运算符应用约束 在 TypeScript 中,keyof 运算符常用于在泛型函数中应用约束。...OptionsFlags 被定义为一个包含类型参数 T 的泛型类型。...函数接受一个 User 对象和一个 User 类型的属性键,并打印相应的用户信息。 应用场景 keyof 运算符在实际开发中有很多应用场景,特别是在处理动态属性访问和确保类型安全时。...在本文中,我们探讨了如何在 TypeScript 泛型、映射类型、显式键、索引签名、条件映射类型和实用类型中使用 keyof 运算符。

    23910

    一文看懂TypeScript工具类型

    在泛型类型声明的时候泛型可以是多个,可以给默认值,有默认值的泛型参数是可选泛型参数,可选泛型参数需要放在泛型定义的后端。...U的默认值是T也就是boolean 泛型约束 泛型约束是在泛型的类型参数上定义一个约束条件,从而限制了泛型实际类型的最大范围,这个类型参数的约束条件就是泛型约束,语法采用了 extends 关键字,类似于类的继承...泛型约束是工具类型的核心。...约束条件有点特殊,它可以引用泛型列表中的其他类型,但是不能循环引用。...联合类型赋值的时候是相联合类型的综合。子类型与父类型联合的结果是父类型,任何类型与never联合是任何类型。对于类、接口等对象的联合,可赋的值是其中任意一个,但访问只能访问所有类型的共有属性和方法。。

    27210
    领券