using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ReflectionTest
{
public class MyClass
{
public int PublicProperty { get; set; }
private string PrivateProperty { get; set; }
protected internal bool ProtectedInternalProperty { get; }
public string Name;
private string value;
public readonly double ReadOnlyProperty = 3.14;
public event EventHandler FieldChanged;
public event EventHandler PropertyChanged;
}
/// <summary>
/// 字段属性信息
/// </summary>
public class ParamsInfo
{
/// <summary>
/// 身份识别名字一般要求一个对象内所有元素相同且不能和其他对象重复
/// </summary>
public string IdName;
/// <summary>
/// 变量名称
/// </summary>
public string Name;
public string TypeName;
/// <summary>
/// 说明姓名一般中文名字
/// </summary>
public string DescName;
/// <summary>
/// 父类名称
/// </summary>
public string FatherName;
public string StringValue;
public bool IsPublic;
/// <summary>
/// 可写的,参数存取需要可写
/// </summary>
public bool CanWrite;
public bool IsField;
public bool IsProperty;
}
internal class Class1
{
public void GetProperty(object myobj)
{
Type type = myobj.GetType();
// 获取MyClass的所有属性
PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
foreach (PropertyInfo property in properties)
{
// 输出属性名
Console.WriteLine("属性名: " + property.Name);
// 输出属性类型
Console.WriteLine("属性类型: " + property.PropertyType);
// 判断属性是否可读
if (property.CanRead)
Console.WriteLine("属性是可读的");
else
Console.WriteLine("属性是不可读的");
// 判断属性是否可写
if (property.CanWrite)
Console.WriteLine("属性是可写的");
else
Console.WriteLine("属性是不可写的");
Console.WriteLine();
}
}
/// <summary>
/// 获取所有需要的信息
/// </summary>
/// <param name="myobj"></param>
/// <param name="requireinfo"></param>
public void GetAllParams(object myobj, out List<ParamsInfo> minfos, bool findPublic = true, bool findField = true, bool findProperty = true, bool findStatic = false)
{
BindingFlags bindingFlags = findPublic ? BindingFlags.Public : BindingFlags.IgnoreReturn;
bindingFlags |= findField ? BindingFlags.GetField : BindingFlags.IgnoreReturn;
bindingFlags |= findProperty ? BindingFlags.GetProperty : BindingFlags.IgnoreReturn;
bindingFlags |= findStatic ? BindingFlags.Static : BindingFlags.IgnoreReturn;
GetAllParams(myobj, bindingFlags,out minfos);
}
public void GetAllParams(object myobj, BindingFlags bindingFlags, out List<ParamsInfo> minfos)
{
minfos = new List<ParamsInfo>();
if (myobj == null)
{
Console.WriteLine("GetAllParams输入对象空: ");
return;
}
Type myobjType = myobj.GetType();
MemberInfo[] members = myobjType.GetMembers(bindingFlags);
if ((members?.Length ?? 0) < 1)
{
Console.WriteLine("GetAllParams输入对象不包含内容: ");
return;
}
foreach (var mb in members)
{
ParamsInfo curinfo = new ParamsInfo();
curinfo.Name = mb.Name;
curinfo.IsPublic = mb.GetType().IsPublic;
curinfo.TypeName = mb.GetType().Name;
if (mb is PropertyInfo pp)
{
curinfo.IsProperty = true;
curinfo.StringValue = pp.GetValue(myobj).ToString();//这里需要做处理序列化为字符串
}
else if (mb is FieldInfo fd)
{
curinfo.IsField = true;
curinfo.StringValue = fd.GetValue(myobj).ToString();//这里需要做处理序列化为字符串
}
minfos.Add(curinfo);
}
}
}
}
反射存取参数测试
最新推荐文章于 2025-04-11 17:28:20 发布