[C#]使用反射搭配Extension Method來Reset物件


看到網友在論壇發問的問題,想起之前在開發時有用過反射與擴充方法去將物件初始,擴充方法如下,可將物件的屬性值初始:



public static class ObjectExtension

{

public static void Reset(this object obj)

{

foreach (var p in obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))

{

if (!p.CanWrite)

continue;

var defaultValue = (p.GetCustomAttributes(typeof(DefaultValueAttribute), false) as DefaultValueAttribute[]).FirstOrDefault();

p.SetValue(obj, (defaultValue == null) ? (p.PropertyType.IsValueType ? Activator.CreateInstance(p.PropertyType) : null) : defaultValue.Value, null);

}

}

}





簡易的使用範例:



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ComponentModel;



namespace ConsoleApplication13

{

class Program

{

static void Main(string[] args)

{

var people = new Person()

{

Name =”Larry”,

Sex= Person.SexType.Boy,

Age=32

};



ShowPeople(people);



people.Reset();



Console.WriteLine(new string(‘=’, 50));

ShowPeople(people);

}



static void ShowPeople(Person people)

{

Console.WriteLine(String.Format (“Name: {0}”,people.Name));

Console.WriteLine(String.Format(“Sex: {0}”, people.Sex));

Console.WriteLine(String.Format(“Age: {0}”, people.Age));

}

}



public class Person

{

public enum SexType

{

Boy,

Girl

}



public string Name { get; set; }

public SexType Sex { get; set; }



[DefaultValue(18)]

public int Age { get; set; }

}

}





運行結果如下:



image