Вычисление общей длины всех строковых свойств в объекте - PullRequest
3 голосов
/ 14 октября 2011

У меня есть объект с сотнями свойств.все они являются строками. Как я могу вычислить общую длину всех свойств вместе взятых?

MyAttempt:

    public static int GetPropertiesMaxLength(object obj)
    {
        int totalMaxLength=0;
        Type type = obj.GetType();
        PropertyInfo[] info = type.GetProperties();
        foreach (PropertyInfo property in info)
        {
           // ? 
            totalMaxLength+=??
        }
        return totalMaxLength;
    }

Предложения?

Ответы [ 7 ]

4 голосов
/ 14 октября 2011

Использование LINQ Sum () и Где () методы:

public static int GetTotalLengthOfStringProperties(object obj)
{            
    Type type = obj.GetType();
    IEnumerable<PropertyInfo> info = type.GetProperties();

    int total = info.Where(p => p.PropertyType == typeof (String))
                    .Sum(pr => (((String) pr.GetValue(obj, null)) 
                               ?? String.Empty).Length);
    return total;
}

PS: до включить LINQ, к которому выдобавить using System.Linq;

РЕДАКТИРОВАТЬ: Более общий подход

/// <summary>
/// Gets a total length of all string-type properties
/// </summary>
/// <param name="obj">The given object</param>
/// <param name="anyAccessModifier">
/// A value which indicating whether non-public and static properties 
/// should be counted
/// </param>
/// <returns>A total length of all string-type properties</returns>
public static int GetTotalLengthOfStringProperties(
                                  object obj, 
                                  bool anyAccessModifier)
{
    Func<PropertyInfo, Object, int> resolveLength = (p, o) =>        
        ((((String) p.GetValue(o, null))) ?? String.Empty).Length;

    Type type = obj.GetType();
    IEnumerable<PropertyInfo> info = anyAccessModifier 
        ? type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | 
                             BindingFlags.Instance | BindingFlags.Static)
        : type.GetProperties();    

    int total = info.Where(p => p.PropertyType == typeof (String))
                    .Sum(pr => resolveLength(pr, obj));
    return total;
}
1 голос
/ 14 октября 2011

Чтобы получить значение свойства по его PropertyInfo, используйте метод GetValue, передающий содержащий объект и не содержащий параметров (если это не индексированное свойство - что усложнит ситуацию):

public static int GetPropertiesMaxLength(object obj) {
  int totalMaxLength=0;
  Type type = obj.GetType();
  PropertyInfo[] info = type.GetProperties();
  foreach (PropertyInfo property in info) {
     if (property.PropertyType == typeof(string)) {
       string value = property.GetValue(obj, null) as string;
       totalMaxLength += value.Length;
    }
  }
  return totalMaxLength;
}
1 голос
/ 14 октября 2011

Как это

public static int GetPropertiesMaxLength(object obj)
{
    int totalMaxLength=0;
    Type type = obj.GetType();
    PropertyInfo[] info = type.GetProperties();
    foreach (PropertyInfo property in info)
    {
        totalMaxLength+= property.GetValue(obj, null).ToString().Length;
    }
    return totalMaxLength;
}
0 голосов
/ 14 октября 2011
public static int GetPropertiesMaxLength(object obj)
{
    Type type = obj.GetType();
    PropertyInfo[] info = type.GetProperties();
    int totalMaxLength = info.Sum(prop => (prop.GetValue(prop, null) as string).Length);        
    return totalMaxLength;
}

Попробуйте это.

0 голосов
/ 14 октября 2011
        int count = value.GetType()
            .GetProperties()
            .Where(p => p.PropertyType == typeof (string) && p.CanRead)
            .Select(p => (string) p.GetValue(value, null))
            .Sum(s => (string.IsNullOrEmpty(s) ? 0 : s.Length));

Вы можете изменить положение where в соответствии с вашими потребностями. Например, если вы хотите исключить статические данные или рядовые и т. Д.

0 голосов
/ 14 октября 2011

Вот мое предложение:

    public static int GetPropertiesMaxLength(object obj)
    {
        int totalMaxLength = 0;
        Type type = obj.GetType();
        PropertyInfo[] info = type.GetProperties();
        foreach (PropertyInfo property in info)
        {
            var value = property.GetValue(obj, null) as string;
            if (!string.IsNullOrEmpty(value))
            {
                totalMaxLength += value.Length;
            }
        }
        return totalMaxLength;
    }
0 голосов
/ 14 октября 2011

Предполагая, что все свойства являются общедоступными:

Object objValue = property.GetValue(obj, null);
if(objValue  != null)
  totalMaxLength += obj
Value.ToString().Length;

Если свойства не все общедоступны, вам придется объединить необходимые флаги привязки, подобные этому

Object objValue = property.GetValue(obj, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static /* etc... */, null, null, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...