• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
微软(北京).Net俱乐部-H2O、winnerzone
一个战士一旦穿上军装拿起武器就已经做好了战斗的准备,他将被派往无数战火纷飞的战场,每一次都会有生命的危险。
但是一旦他活下来了,那些都将成为光荣的历史被讲述和回忆。对于一个新兵,危险和机遇并存,机遇大于危险和压力。
博客园    首页    新随笔    联系   管理    订阅  订阅

【翻译】代码片段:C# 自动实现属性的意想不到行为

在这个代码片断中,Joseph 测试了一个使用 C# 反射来自动实现属性时,发生了一个意想不到行为的方案。之后提供了该方案的分步说明,他提供了示例项目最终输出的截图、相关的 C# 完整代码、Visual Studio 2008的项目下载。

摘要

在这个代码片断中,Joseph 测试了一个使用 C# 反射来自动实现属性时,发生了一个意想不到行为的方案。之后提供了该方案的分步说明,他提供了示例项目最终输出的截图、相关的 C# 完整代码、Visual Studio 2008的项目下载。

by Joseph Chahine

Code

Listing 1: Employee.cs

using System;
namespace CompilerGeneratedProps
{
    
public class Employee : Person
    
{
        
//Fields
        protected string Title;
    }

}

Listing 2: Person.cs

using System;
namespace CompilerGeneratedProps
{
    
public class Person
    
{
        
//Fields
        protected string _LastName; //Declared protected for extensibility.
 
        
//Properties
        public string FirstName { get; set; } //Auto-implemented property.
 
        
public string LastName
        
{
            
get
            
{
                
return this._LastName;
            }

            
set
            
{
                
this._LastName = value;
            }

        }

    }

}

Listing 3: Program.cs

using System;
using System.Reflection;
 
namespace CompilerGeneratedProps
{
  
public class Program
  
{
    
static void Main(string[] args)
    
{
      Console.WriteLine(
"Fields seen in an instance of Person");
      Console.WriteLine(
"-------------------------------------------------------");
 
      Person objPerson 
= new Person();
      
foreach (FieldInfo fi in 
        objPerson.GetType().GetFields(BindingFlags.Instance 
| 
        BindingFlags.NonPublic 
| BindingFlags.Public))
      
{
        Console.WriteLine(fi.Name);
      }

 
      Console.WriteLine(
"\n\n\n\nFields seen in an instance of Employee");
      Console.WriteLine(
"-------------------------------------------------------");
 
      Employee objEmployee 
= new Employee();
      
foreach (FieldInfo fi in 
        objEmployee.GetType().GetFields(BindingFlags.Instance 
| 
        BindingFlags.NonPublic 
| BindingFlags.Public))
      
{
        Console.WriteLine(fi.Name);
      }
 
      Console.Read();
    }

  }

}

结果输出:

项目下载:[Download Source]

结论

如果在一个父类中使用自动实现属性,使用反射来收集一个派生类的字段将不会获得对应于上述所说的属性字段。经典方法在这种情况下编码属性会更好。


WINNERZONE
posted @ 2008-06-26 22:18  H2O、winnerzone  阅读(3289)  评论(15)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3