微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从C#中的对象清除所有字符串成员

如何解决从C#中的对象清除所有字符串成员

| 我有一个包含大约500个String成员的类,我想通过将它们设置为String.Empty来“重置”它们。谁能告诉我如何使用反射来做到这一点,以便我可以遍历每个String成员? 谢谢     

解决方法

        
foreach (PropertyInfo pi in MyObj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic ).ToArray() )
            {
                if (pi.PropertyType == typeof(string))
                {
                    pi.SetValue(MyObj,string.Empty,null);
                }
            }
田间使用
foreach (FieldInfo fi in MyObj.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic ).ToArray() )
            {
                if (fi.FieldType == typeof(string))
                {
                    fi.SetValue(MyObj,string.Empty);
                }
            }
    ,        
typeof(MyClass).GetProperties()
               .Where(p => p.PropertyType == typeof(string))
               .ToList()
               .ForEach(p => p.SetValue(myObj,null));
编辑: 如果您要处理字段而不是属性,则非常相似
typeof(MyClass).GetFields()
               .Where(f => f.FieldType == typeof(string))
               .ToList()
               .ForEach(f => f.SetValue(myObj,string.Empty));
    ,        使用编译的Expression-Tree实现的相同代码:
private static Action<TObject> CreateClearStringProperties<TObject>()
{
    var memberAccessExpressions = new List<System.Linq.Expressions.Expression>();

    System.Linq.Expressions.ParameterExpression arg = System.Linq.Expressions.Expression.Parameter(typeof(TObject),\"x\");

    foreach (var propertyInfo in typeof(TObject).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy))
    {
        if (propertyInfo.PropertyType == typeof(string) && propertyInfo.SetMethod != null)
        {
            var memberAccess = System.Linq.Expressions.Expression.MakeMemberAccess(arg,propertyInfo);

            var assignment = System.Linq.Expressions.Expression.Assign(memberAccess,System.Linq.Expressions.Expression.Constant(string.Empty));

            memberAccessExpressions.Add(assignment);
        }
    }

    foreach (var fieldInfo in typeof(TObject).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy))
    {
        if (fieldInfo.FieldType == typeof(string))
        {
            var memberAccess = System.Linq.Expressions.Expression.MakeMemberAccess(arg,fieldInfo);

            var assignment = System.Linq.Expressions.Expression.Assign(memberAccess,System.Linq.Expressions.Expression.Constant(string.Empty));

            memberAccessExpressions.Add(assignment);
        }
    }

    if (memberAccessExpressions.Count == 0)
        return new Action<TObject>((e) => { });

    var allProperties = System.Linq.Enumerable.Aggregate(memberAccessExpressions,System.Linq.Expressions.Expression.Block);

    return System.Linq.Expressions.Expression.Lambda<Action<TObject>>(allProperties,arg).Compile();
}
使用方法示例:
Action<MyClass> clearObject = CreateClearStringProperties<MyClass>();
MyClass obj = new MyClass();
clearObject(obj);
一些通用池逻辑需要使用该逻辑,其中放回池中的对象不应使过时的字符串对象保持活动状态。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。