您的位置:首页 > 编程语言 > C#

typeof(C# 参考)C# 反射 通过类名创建类实例

2012-02-07 16:55 417 查看
C# 反射 通过类名创建类实例2011-12-24 上午 12:34“反射”其实就是利用程序集的元数据信息。

 

反射可以有很多方法,编写程序时请先导入

System.Reflection 命名空间,假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型):

Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL)

 object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例

 

若要反射当前项目中的类可以为:

 Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集

object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)");

// 创建类的实例,返回为 object 类型,需要强制类型转换 也可以为:

Type type = Type.GetType("类的完全限定名"); object obj = type.Assembly.CreateInstance(type); ======================================================= 补充:1)反射创建某个类的实例时,必须保证使用类的完全限定名(命名空间 + 类名)。Type.GetType 方法返回 null 则意味搜索元数据中的相关信息失败(反射失败),请确保反射时使用类的完全限定名。2)反射功能十分强大,没有什么不能实现的。若实现“跨程序集”,请使用第一种方法创建类的实例,并反射该实例的字段、属性、方法、事件...
然后动态调用之。

主页

技术资源库

学习

下载

支持

社区  登录 | 中国(简体中文) |  | 

  

MSDN Library

开发工具和语言

Visual Studio 2010

Visual Studio

Visual Studio 语言

Visual Basic 和 Visual C#

Visual C#

C# 参考

C# 关键字

运算符关键字(C# 参考)

as(C# 参考)

is(C# 参考)

new(C# 参考)

sizeof(C# 参考)

typeof(C# 参考)

true(C# 参考)

false(C# 参考)

stackalloc(C# 参考)

 社区内容

 添加代码示例和提示以增强此主题。

更多...

 此文章由人工翻译。 将光标移到文章的句子上,以查看原文。  译文

原文

typeof(C# 参考)

 Visual Studio 2010

 其他版本

 此主题尚未评级 评价此主题

用于获取类型的 System.Type 对象。 typeof 表达式采用以下形式:

System.Type type = typeof(int);

备注

若要获取表达式的运行时类型,可以使用 .NET Framework 方法 GetType,如以下示例中所示:

int i = 0;

System.Type type = i.GetType();

不能重载 typeof 运算符。

typeof 运算符也能用于公开的泛型类型。 具有不止一个类型参数的类型的规范中必须有适当数量的逗号。 下面的示例演示如何确定方法的返回类型是否是泛型 IEnumerable(Of T)。 假定此方法是 MethodInfo 类型的实例:

string s = method.ReturnType.GetInterface

    (typeof(System.Collections.Generic.IEnumerable<>).FullName);

示例

C#

public class ExampleClass

{

   public int sampleMember;

   public void SampleMethod() {}

   static void Main()

   {

      Type t = typeof(ExampleClass);

      // Alternatively, you could use

      // ExampleClass obj = new ExampleClass();

      // Type t = obj.GetType();

      Console.WriteLine("Methods:");

      System.Reflection.MethodInfo[] methodInfo = t.GetMethods();

      foreach (System.Reflection.MethodInfo mInfo in methodInfo)

         Console.WriteLine(mInfo.ToString());

      Console.WriteLine("Members:");

      System.Reflection.MemberInfo[] memberInfo = t.GetMembers();

      foreach (System.Reflection.MemberInfo mInfo in memberInfo)

         Console.WriteLine(mInfo.ToString());

   }

}

/*

 Output:

    Methods:

    Void SampleMethod()

    System.String ToString()

    Boolean Equals(System.Object)

    Int32 GetHashCode()

    System.Type GetType()

    Members:

    Void SampleMethod()

    System.String ToString()

    Boolean Equals(System.Object)

    Int32 GetHashCode()

    System.Type GetType()

    Void .ctor()

    Int32 sampleMember

*/

 

此示例使用 GetType 方法确定用来包含数值计算的结果的类型。 这取决于结果数字的存储要求。

C#

class GetTypeTest

{

    static void Main()

    {

        int radius = 3;

        Console.WriteLine("Area = {0}", radius * radius * Math.PI);

        Console.WriteLine("The type is {0}",

                          (radius * radius * Math.PI).GetType()

        );

    }

}

/*

Output:

Area = 28.2743338823081

The type is System.Double

*/

C# 语言规范

有关更多信息,请参见 C# 语言规范。C# 语言规范是 C# 语法和用法的权威资料。

请参见

参考

C# 关键字

is(C# 参考)

运算符关键字(C# 参考)

System.Type

概念

C# 编程指南

其他资源

C# 参考

 本文是否对您有所帮助? 是 否

社区内容 添加

 常见问题

 © 2012 Microsoft. 版权所有。

保留所有权利 | 商标 | 隐私权声明 | 个人信息中心 | 法律信息 | MSDN Flash 中心 | 联系我们 |  网站反馈  

Assume that method is an instance of a MethodInfo type:

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: