专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » java读取属性文件:C#反射技术的一读取和设置类的属性 »正文

java读取属性文件:C#反射技术的一读取和设置类的属性

来源: 发布时间:星期五, 2009年1月9日 浏览:9次 评论:0
  要用C#反射技术首先得引入.Reflection 命名空间这个命名空间里具有动态加载集、类型动态思路方法、设置和取得属性和字段值、可以获取类型和思路方法信息功能

  要想对个类型例子属性或字段进行动态赋值或取值首先得得到这个例子或类型Type,微软已经为我们提供了足够多思路方法

1ClassMyClass
2{
3 privatefield;
4 publicField
5 {
6   get
7    {
8     this.field;
9    }
10   
11    {
12      this.field=value;
13    }
14 }
15}


  如果有个这个类型例子:

  MyClass myObj = MyClass;

  我们要动态为这个例子属性Field赋值那么得先得到这个例子类型:

  Typet=typeof(MyClass);另种思路方法是:

  Typet=myObj.GetType;只要我们得到了对象类型那么我们就可以利用反射对这个对象“为所欲为”了哈哈

  t.GetProperty("Field").SetValue(myObj,1,null);这样我们就为对象里属性Field赋值了如果把属性名和要赋值写道配置文件里我们就可以达到运行期间动态为属性赋值了

  利用反射获取属性值思路方法:

  propValue=Convert.ToInt32(t.GetProperty("Field").SetValue(myObj,null));好了有关利用反射动态为对象属性赋值取值就到这里了

  (C#)利用反射动态类成员

  使用反射动态类成员需要Type类个思路方法:InvokeMember对该思路方法声明如下:

public object InvokeMember(
  name,
 BindingFlags invokeAttr,
 Binder binder,
 object target,
 object args
);


  参数

  name

  String它包含要构造、思路方法、属性或字段成员名称

  - 或 -

  空串 ("")表示默认成员

  invokeAttr

  个位屏蔽个或多个指定搜索执行方式 BindingFlags 组成访问可以是 BindingFlags 的如 Public、NonPublic、Private、InvokeMethod 和 GetField 等不需要指定查找类型如果省略查找类型则将应用 BindingFlags.Public | BindingFlags.Instance

  binder

  个 Binder 对象该对象定义组属性并启用绑定而绑定可能涉及选择重载思路方法、强制参数类型和通过反射成员

  - 或 -

  若为空引用(Visual Basic 中为 Nothing)则使用 DefaultBinder

  target

  要在其上指定成员 Object

  args

  包含传递给要成员参数

  返回值

  表示被成员返回值 Object

  备注:

  下列 BindingFlags 筛选标志可用于定义包含在搜索中成员:

  为了获取返回值必须指定 BindingFlags.Instance 或 BindingFlags.Static

  指定 BindingFlags.Public 可在搜索中包含公共成员

  指定 BindingFlags.NonPublic 可在搜索中包含非公共成员(即私有成员和受保护成员)

  指定 BindingFlags.FlattenHierarchy 可包含层次结构上静态成员

  下列 BindingFlags 修饰符标志可用于更改搜索执行方式:

  BindingFlags.IgnoreCase表示忽略 name 大小写

  BindingFlags.DeclaredOnly仅搜索 Type 上声明成员而不搜索被简单继承成员

  可以使用下列 BindingFlags 标志表示要对成员采取操作:

  CreateInstance表示构造忽略 name对其他标志无效

  InvokeMethod表示思路方法而不构造或类型值设定项对 SetField 或 SetProperty 无效

  GetField表示获取字段值对 SetField 无效

  SetField表示设置字段值对 GetField 无效

  GetProperty表示获取属性对 SetProperty 无效

  SetProperty 表示设置属性对 GetProperty 无效

  下面通过例题对该思路方法进行简单应用(我直以为要让例题起到更容易理解文字意义和作用撰写例题越简单越直观越好)

using ;
using .Reflection;
&nb
  ConsoleApplication9
{
   Love
  {
    public field1;
    private _name;
    public Love
    {
    }
    public Name
    {
      get
      {
         _name;
}
      
      {
        _name=value;
      }
    }
    public GetInt( a)
    {
       a;
    }
    public void Display( str)
    {
      Console.WriteLine(str);
    }
  }
  /// <summary>
  /// Class1 摘要介绍说明
  /// </summary>
   Class1
  {
    /// <summary>
    /// 应用主入口点
    /// </summary>
    [STAThread]
     void Main( args)
    {
      //
      // TODO: 在此处添加代码以启动应用
      //
      Love love = Love;
      Type type = love.GetType;
      Object obj = type.InvokeMember(null,
        BindingFlags.DeclaredOnly |
        BindingFlags.Public | BindingFlags.NonPublic |
        BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);
      //没有返回值思路方法
      type.InvokeMember("Display",BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance , null , obj , object{"aldfjdlf"});
      //有返回值思路方法
       i = ()type.InvokeMember("GetInt",BindingFlags.InvokeMethod | BindingFlags#0000cc">.Public | BindingFlags.Instance,null,obj, object{1});
Console.WriteLine(i);
      //设置属性值
      type.InvokeMember("Name",BindingFlags.SetProperty,null,obj, {"abc"});
      //获取属性值
       str=()type.InvokeMember("Name",BindingFlags.GetProperty,null,obj,null);
      Console.WriteLine(str);
      //设置字段值
      type.InvokeMember("field1",BindingFlags.SetField,null,obj, object{444});
      //获取字段值
       f=()type.InvokeMember("field1",BindingFlags.GetField,null,obj,null);
      Console.WriteLine(f);
      Console.ReadLine;
    }
  }
}


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: