使用扩展方法增强接口功能

扩展方法其实就是一个静态方法,只不过微软封装成了语法糖

从MSIL中我们可以看出,这段代码编译后和调用静态方法没有任何的差别(从call指令来看,这是在调用一个静态方法)。

从这里可以知道扩展方法即可以使用实例调用的方式也可以直接使用静态类调用的方式:

str.GetValueByName("Length");

PropertyExtension.GetValueByName(str,"Length");

 1 using System;
 2 namespace WindowsFormsApplication1
 3 {
 4     static class Program
 5     {
 6         static void Main()
 7         {
 8             MyClass c = new MyClass();
 9             c.MyTest002();
10             Console.Read();
11         }
12     }
13     interface MyInterface
14     {
15         void Test01();
16     }
17     static class MyExtensionMethods
18     {
19         public static void MyTest002(this MyInterface ii)
20         {
21             Console.WriteLine("Hello,World!");
22         }
23     }
24     public class MyClass : MyInterface
25     {
26         public MyClass()
27         { }
28         public void Test01()
29         {
30             Console.WriteLine("Test01");
31         }
32     }
33 }

扩展方法定义:

扩展方法调用:

用到的Ildasm位置:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe

以下是配置ildasm的相关文档

为Visual Studio添加Ildasm工具的方法

工具-附加工具

标题:ILDASM

命令:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe

这样就在工具中出现Ildasm工具
打开一个dll或者exe可以查看属性。

url:http://greatverve.cnblogs.com/archive/2012/02/17/Ildasm.html
AssemblyInfo.cs文件中的程序集属性

下面是默认的AssemblyInfo.cs文件的内容
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyTitle("")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.0.*")]

[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("")]

其意义如下:
1. [assembly: AssemblyTitle("")]
[assembly: AssemblyTitle("")]代码中”:”好前面的assembly表示此属性在程序集范围内发生作用。
类型名:System.Reflection.AssemblyTitleAttribute
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyTitleAttribute : Attribute

此属性描述程序集的名称,如:某某公司某某项目某某模块等,此名称可以是任何合法的字符串,可以有空格。

2. [assembly: AssemblyDescription("")]
类型名:
System.Reflection.AssemblyDescriptionAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyDescriptionAttribute : Attribute

功能:
程序集的简单描述,如功能、语言等

3. [assembly: AssemblyDescription("")]
类型名:
System.Reflection.AssemblyDescriptionAttribute

Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyDescriptionAttribute : Attribute
功能:
程序集的简单说明,描述程序集的功能、特性、约束等
4. [assembly: AssemblyConfiguration("")]
类型名:
System.Reflection.AssemblyConfigurationAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyConfigurationAttribute : Attribute
功能:
程序集的配置信息,如:零售、发布、调试等,.NET运行时没有使用此属性
5. [assembly: AssemblyCompany("")]
类型名:
System.Reflection.AssemblyCompanyAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyCompanyAttribute : Attribute
功能:
程序集所属的公司名称
6. [assembly: AssemblyProduct("")]
类型名:
System.Reflection.AssemblyProductAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyProductAttribute : Attribute
功能:
程序集所述的产品名

7. [assembly: AssemblyCopyright("")]
类型名:
System.Reflection.AssemblyCopyrightAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyCopyrightAttribute : Attribute
功能:
程序集的版权信息

8. [assembly: AssemblyTrademark("")]
类型名:
System.Reflection.AssemblyTrademarkAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyTrademarkAttribute : Attribute
功能:
程序集的商标信息

9. [assembly: AssemblyCulture("")]
类型名:
System.Reflection.AssemblyCultureAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyCultureAttribute : Attribute
功能:
枚举的字段表明程序集支持的区域性。程序集也可以指定区域独立性,表明它包含用于默认区域性的资源。运行库将任何区域性属性未设为空的程序集按附属程序集处理。此类程序集受附属程序集绑定规则约束。详细信息,请参见运行库如何定位程序集。

10. [assembly: AssemblyVersion("")]
类型名:
System.Reflection.AssemblyVersionAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyVersionAttribute : Attribute
功能:

序集版本信息,按照4段式保存版本信息,即:主.次要.内部版本.修改版本。在强名称程序集中CLR使用此值来绑定操作。可以使用通配符*来替代内部版本
和修改版本,VS将自动为其生成版本号。如定义为“1.0.*”,则VS会自动生成后面的部分。如果设定为*,则每次修改程序后版本号都会自动发生变更。

11. [assembly: AssemblyDelaySign(false)]
类型名:
System.Reflection.AssemblyDelaySignAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyDelaySignAttribute : Attribute
功能:
是否使用延迟签名

12. [assembly: AssemblyKeyFile("")]
类型名:
System.Reflection.AssemblyKeyFileAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyKeyFileAttribute : Attribute
功能:
包含了公钥(如果使用延迟签名)或者既包含公钥也包含私钥的文件名。此公钥和私钥将作为参数传递至此属性的构造函数。文件名称与输出文件路径(.exe 或 .dll)相关,与源文件路径无关。
13. [assembly: AssemblyKeyName("")]
类型名:
System.Reflection.AssemblyKeyNameAttribute
Attribute声明:
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class AssemblyKeyNameAttribute : Attribute
功能:
表明包含密钥对(作为参数传递至此属性的构造函数)的密钥容器。
--------------------------------------------------------------------------

C#取得AssemblyInfo.cs的项目属性

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Reflection;
  9. namespace Assmest
  10. {
  11. public partial class Form1 : Form
  12. {
  13. public Form1()
  14. {
  15. InitializeComponent();
  16. this.Text=string.Format(String.Format("关于 {0}", AssemblyTitle));
  17. }
  18. public string AssemblyTitle
  19. {
  20. get
  21. {
  22. // 获取此程序集上的所有 Title 属性
  23. object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
  24. // 如果至少有一个 Title 属性
  25. if (attributes.Length > 0)
  26. {
  27. // 请选择第一个属性
  28. AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
  29. // 如果该属性为非空字符串,则将其返回
  30. if (titleAttribute.Title != "")
  31. return titleAttribute.Title;
  32. }
  33. // 如果没有 Title 属性,或者 Title 属性为一个空字符串,则返回 .exe 的名称
  34. return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
  35. }
  36. }
  37. }
  38. }

其他的属性有:

  1. Assembly.GetExecutingAssembly().GetName().Version.ToString();
  2. AssemblyDescriptionAttribute
  3. AssemblyProductAttribute
  4. AssemblyCopyrightAttribute
  5. AssemblyCompanyAttribute

参考:http://msdn.microsoft.com/zh-cn/library/system.web.ui.scriptreference.assembly(v=VS.90).aspx

时间: 2024-11-07 00:59:20

使用扩展方法增强接口功能的相关文章

1.扩展方法2.接口的隐式实现和显式实现

1.扩展方法:必须写在一个静态类里面,具体见代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 namespace ConsoleApplication1 {     class Program     {         static void Main(string[] args)         {             Student s = new Stud

基于Java的Jess功能函数扩展方法

Jess是Java expert system shell的缩写,是Java平台上的规则引擎,它是CLIPS程序设计语言的超集,是完全使用Java语言编写一种用于开发专家系统的语言.对于基于规则的推理,特别是针对逻辑条件的推理,Jess是已知规则引擎中最快的.它以增强型Rete算法为基础,支持前向推理,也支持后向推理,具有直接对Java对象进行推理,支持对工作存储区的查询访问等特点[1-2]. Jess语言本身提供了很多功能强大的函数供专家系统开发者调用,但这些函数不可能囊括一切功能和运算,若仅

用UseMiddleware扩展方法注册中间件类

用UseMiddleware扩展方法注册中间件类 .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除了直接用ApplicationBuilder的Use()方法注册中间件外,还可以使用ApplicationBuilder的扩展方法UseMiddleware()注册中间件.这种情况下可以注册类型,这个方法会通过反射解析这个类型,并把它包装成Func<

扩展方法从简单应用到深入解析,读这一篇文章就够了

前言(扯淡-_-) 大家好,今天和大家聊聊扩展的事,我将带着大家从简单应用开始深入理解扩展方法的原理,并对扩展方法的使用给出合理的建议. 在实际应用中,当我们在使用某类时发现类中缺少我们想要的方法,最简单直接的就是修改类的源代码来添加我们想要的方法.但事实往往不如人意,总会因为各种因素不可以直接修改源码:拿不到源码.不允许修改,这时候通过继承并扩展的方式来复用是再好不过了,但是如果连最后的继承的权利都剥夺的话(密封类不允许继承)?...这时候就需要用到[扩展方法]了. 扩展方法简介 我们先来看看

C#高级功能(四)扩展方法和索引

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.  它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀.  仅当你使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中. 最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Col

IEnumerable接口的扩展方法

/// <summary>/// IEnumerable接口的扩展方法,支持它的实现类是List的情况/// </summary>using System.Collections.Generic;public static class IEnumerableExtensions{ /// <summary> /// 向集合中添加元素 /// </summary> /// <typeparam name="T"></typ

APK扩展文件介绍、功能及使用方法

APK扩展文件介绍 Android Market (Google Play Store)中每个APK文件的最大限制是50MB.如果您的程序中包含大量的数据文件,以前您只能把这些数据文件放到自己的服务器上,当用户启动程序的时候让用户去下载.现在这些数据文件可以直接上传到Android Market了.在新的Market控制台上传App的时候,可以添加扩展文件了. 如何使用扩展文件: 每个APK可以有2个扩展文件,每个文件最大限制是2GB.为了减少用户的带宽消耗,最好使用压缩格式文件吧. 这两扩展文

使用扩展方法来扩展接口

不清楚扩展方法的清先预热下 推荐:http://www.cnblogs.com/luluping/archive/2008/05/26/1207530.html 摘抄:http://www.cnblogs.com/luluping/archive/2008/05/26/1207536.html 1.扩展方法跟原来类的方法重名时候的处理逻辑 2.扩展方法的嵌套 现在我们来看扩展方法使用的第三个场景:使用扩展方法来扩展接口 应用场景举例: 我们有时候会发现最初定义的一个接口,在现在环境下,这个接口需

扩展方法的几个实例,扩展基本类型、接口、通过反射让扩展方法使用私有成员等

.net扩展方法可以扩展很多类型,包括:基本数据类型.接口.类,等等.如果,需要扩展的类型包含私有成员,扩展方法如何运用这些私有成员呢?本篇逐一体验,包括: ■ 扩展基本数据类型■ 扩展接口■ 扩展包含私有字段的类 使用反射获取类的私有字段■ 扩展一个类的私有嵌套类 通过反射 扩展方法有几个必要前提:● 扩展方法所在的类必须是静态类● 扩展方法本身必须是静态方法● 扩展方法参数中,对类型的扩展参数前必须加this关键字 扩展基本数据类型 针对DateTime类型写一个扩展方法. public s