- 浏览: 3052864 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
在IronPython 46307的MemberExpression.cs里,可以看到DLR是如何获取一个get或者set方法对应的属性的PropertyInfo的:
这代码太丑了,居然要自己遍历类型的所有属性,线性的一个个找 = =
.NET Framework的标准库怎么就不提供标准的方法来查询一个方法是否是某个属性的get或者set方法呢,属性明明不只是C#的概念,也是CLI的概念啊。看来类似的功能得加到自己的utils里去,不然每次都这么搞太麻烦了。
DLR里有很多扩展方法都值得借鉴,因为光靠.NET标准库提供的方法很多时候还是会重复不少代码的。像是一些对数组的扩展方法就挺不错的。
/// <summary> /// Creates a <see cref="MemberExpression"/> accessing a property. /// </summary> /// <param name="expression">The containing object of the property. This can be null for static properties.</param> /// <param name="propertyAccessor">An accessor method of the property to be accessed.</param> /// <returns>The created <see cref="MemberExpression"/>.</returns> public static MemberExpression Property(Expression expression, MethodInfo propertyAccessor) { ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); ValidateMethodInfo(propertyAccessor); return Property(expression, GetProperty(propertyAccessor)); } private static PropertyInfo GetProperty(MethodInfo mi) { Type type = mi.DeclaringType; BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic; flags |= (mi.IsStatic) ? BindingFlags.Static : BindingFlags.Instance; PropertyInfo[] props = type.GetProperties(flags); foreach (PropertyInfo pi in props) { if (pi.CanRead && CheckMethod(mi, pi.GetGetMethod(true))) { return pi; } if (pi.CanWrite && CheckMethod(mi, pi.GetSetMethod(true))) { return pi; } } throw Error.MethodNotPropertyAccessor(mi.DeclaringType, mi.Name); } private static bool CheckMethod(MethodInfo method, MethodInfo propertyMethod) { if (method == propertyMethod) { return true; } // If the type is an interface then the handle for the method got by the compiler will not be the // same as that returned by reflection. // Check for this condition and try and get the method from reflection. Type type = method.DeclaringType; if (type.IsInterface && method.Name == propertyMethod.Name && type.GetMethod(method.Name) == propertyMethod) { return true; } return false; }
这代码太丑了,居然要自己遍历类型的所有属性,线性的一个个找 = =
.NET Framework的标准库怎么就不提供标准的方法来查询一个方法是否是某个属性的get或者set方法呢,属性明明不只是C#的概念,也是CLI的概念啊。看来类似的功能得加到自己的utils里去,不然每次都这么搞太麻烦了。
DLR里有很多扩展方法都值得借鉴,因为光靠.NET标准库提供的方法很多时候还是会重复不少代码的。像是一些对数组的扩展方法就挺不错的。
发表评论
-
对象的重量
2011-08-21 17:15 0http://domino.research.ibm.com/ ... -
IronRuby 1.1系的自适应执行(解释/编译的混合模式)
2010-10-29 14:12 0IronRuby自身的compiler部分基本上还是保持不变的 ... -
Expression Tree中的Constant被编译后放到哪里去了?
2010-02-28 16:21 0Expression.Constant()可以放任意对象进去作 ... -
拿ETv2来生成方法体的两种阳春办法
2009-09-22 06:03 0System.Type System.Reflection.E ... -
C#的语言结构到Expression Tree v2的映射
2009-05-21 03:11 0在.NET Framework 4 Beta 1中,Expre ... -
.NET Framework 4.0 Beta 1里的Expression Tree一例
2009-05-20 10:23 2934既然装上了Visual Studio 20 ... -
用Iron-*语言来探索.NET
2009-05-15 23:21 3428刚才写代码的时候又是在不停查文档,甚是心烦。一怒,拿出Iron ... -
自己关于VM的帖的目录
2009-04-07 14:02 69647JavaEye的blog系统只允许把帖放到单一类别下,而不能用 ... -
MIX09上关于DLR解释器消息的一段听记(3月26更新IronPython 2.6A1消息)
2009-03-23 21:09 1864John Lam在MIX 09上做了一个关于动态语言与Silv ... -
答复: C# 4 DLR & Java 7 Invokedynamic
2009-03-22 17:12 3033原帖地址:C# 4 DLR & Java 7 Invo ... -
同一个ParameterExpression被用在不同嵌套层次的lambda里会怎样?
2009-01-16 00:22 2612今天写代码的时候不小心写错了几个地方,把同一个Paramete ... -
CodePlex上放出DLR v0.9 beta
2008-11-27 14:34 2028之前提到过DLR会在CodePlex上拥有自己独立的项目页面, ... -
IronRuby (r170)中respond_to?的实现
2008-11-13 23:29 0IronRuby.Libraries/Builtins/Ker ... -
DLR中的binder的演变
2008-11-11 23:29 0从模糊的“标准消息”转变为明确完整的MetaObject Pr ... -
DLR即将在Codelex开设独立的站点
2008-10-29 23:01 1467DLR官网:Dynamic Language Runtime ... -
IronPython放出RC1
2008-10-23 09:59 1858下载链接:http://www.codep ... -
新的DLR tree改变了Visitor的设计
2008-10-09 00:35 1634之前的一帖提到过访问DLR tree所使用的visitor的实 ... -
对比DLR
2008-10-08 04:32 0Managed JScript: // // AST: E ... -
目前DLR执行一棵DLR tree的过程(针对10月3日的ChangeSet 41087)
2008-10-07 01:46 1816先在Microsoft.Scripting.Actions.C ... -
LINQ与DLR的Expression tree(4):创建静态类型的LINQ表达式树节点
2008-09-27 00:18 9389(Disclaimer:如果需要转载请先与我联系;文中图片请不 ...
相关推荐
如果想获取更复杂的注释结构,例如参数注释,可以使用`MethodInfo`的`GetParameters`方法获取参数信息,并同样通过`GetCustomAttributes`获取参数的注释。 此外,C#编译器还提供了`doc`命令行选项来生成XML文档文件...
这是通过System.Reflection命名空间中的类实现的,如Type、MethodInfo、PropertyInfo等。 1. **Type类**:它是所有类型的基础类,表示.NET Framework类型的元数据。例如,你可以通过typeof()操作符获取类型信息,如...
要使用反射,首先需要获取到Type对象,这可以通过`typeof()`操作符或`Activator.CreateInstance()`方法来实现。例如,`typeof(MyClass)`将返回`MyClass`类型的Type对象。 4. **创建实例(Activator.CreateInstance...
3. 调用成员:使用`MethodInfo`、`ConstructorInfo`、`PropertyInfo`等对象的方法,如`Invoke()`,在运行时执行相应操作。 现在,让我们回到描述中的主题——将数据库字段与UI控件绑定。假设我们有一个数据库表,...
例如,通过MethodInfo和PropertyInfo对象,我们可以获取到类的方法和属性信息,然后通过Invoke()方法执行方法或Get、Set方法修改属性值。 总之,反射在C#中提供了一种灵活的方式,使得程序可以在运行时探索和操作...
例如,你可以通过`typeof`关键字获取类型信息,然后使用`GetMethod`或`GetProperty`来查找并调用相应的方法或访问属性。 自定义特性(Custom Attributes)是.NET中的一种元数据机制,它允许开发者在代码元素(如类...
3. `MethodInfo`:表示类的方法信息,用于调用方法。 4. `PropertyInfo`:表示类的属性信息,用于设置和获取属性值。 在WPF应用程序中,我们可能需要动态地改变UI元素的属性,比如TextBlock的Text属性。以下是如何...
例如,我们可以通过Type类获取任何类型的实例,然后使用MethodInfo、ConstructorInfo和PropertyInfo等类来执行相应的操作。 下面是一个简单的反射示例,展示如何动态调用一个方法: ```csharp using System; using...
通过解析这些概念,旨在帮助读者更好地理解面向对象编程中多态性的实现方式,并掌握如何在实际开发中有效地运用抽象类与抽象方法。 **抽象类简介** 抽象类是一种特殊的类,它主要用于作为其他类的基类,不能被直接...
反射通过System.Reflection命名空间中的类来实现,如Type、MethodInfo、PropertyInfo等。下面是一段简单的反射示例: ```csharp using System; using System.Reflection; public class MyClass { public void ...
对于字段,我们使用GetField和SetField方法(在.NET Core和.NET 5及以上版本中已被废弃,推荐使用GetProperty和SetField)。示例: ```csharp FieldInfo field = myType.GetField("MyField"); field.SetValue(new...
通过反射,程序员可以在不知道具体类型的情况下创建对象、调用方法、获取或设置字段值等。 **1.2 反射的应用场景** - **动态创建对象**:无需提前知道对象的具体类型即可创建。 - **调用方法**:可以在运行时根据...
2. 动态方法调用:无需预先知道方法名称,可以根据字符串或其他标识调用方法。 3. 访问私有和受保护的成员:反射可以用来访问通常不可见的类成员。 4. 序列化和反序列化:用于将对象转换为字节流和从字节流恢复对象...
反射中常用的子类有FieldInfo(字段)、PropertyInfo(属性)、MethodInfo(方法)、ConstructorInfo(构造函数)、EventInfo(事件)等。 #### 三、反射的基本操作 ##### 3.1 加载程序集 反射的第一步通常是加载...
要通过反射获取属性信息,首先需要得到类型实例,然后调用`Type`对象的`GetProperty()`方法。这个方法接受属性名作为参数,可选地接受一个`BindingFlags`枚举值来指定搜索条件。例如: ```csharp Type myType = ...
这主要通过System.Reflection命名空间中的类来实现,如Type、MethodInfo、PropertyInfo等。例如,当你有一个对象实例,你可以通过反射获取它的类型信息,查找并调用其私有或受保护的方法,甚至在运行时发现并加载...
通过`System.Reflection`命名空间提供的类,如`Type`、`MethodInfo`、`PropertyInfo`等,我们可以获取类型信息、调用方法、访问属性和字段,甚至创建动态类型实例。 在本示例中,`ClassGenerator`可能是实现CodeDom...
此命名空间提供了一系列用于处理反射操作的类和接口,比如`Type`、`Assembly`、`MemberInfo`、`MethodInfo`、`PropertyInfo`、`FieldInfo`、`EventInfo`等。 #### 三、反射调用示例 接下来,我们将基于给定的部分...
1. **获取类型信息**:`Type` 类型代表.NET中的任何类型,你可以通过`typeof()`操作符或`object.GetType()`方法获取类型信息。例如: ```csharp Type myType = typeof(MyClass); ``` 2. **创建实例**:使用`...