1. ホーム
  2. c#

PropertyInfoがコレクションであるかどうかを確認する方法

2023-09-08 06:29:07

質問

以下は、IsDirtyチェックのために、クラス内のすべてのパブリックプロパティの初期状態を取得するために使用するいくつかのコードです。

あるプロパティがIEnumerableであるかどうかを確認する最も簡単な方法は何ですか?

乾杯。

ベリル

  protected virtual Dictionary<string, object> _GetPropertyValues()
    {
        return _getPublicPropertiesWithSetters()
            .ToDictionary(pi => pi.Name, pi => pi.GetValue(this, null));
    }

    private IEnumerable<PropertyInfo> _getPublicPropertiesWithSetters()
    {
        return GetType().GetProperties().Where(pi => pi.CanWrite);
    }

最新情報

最終的にやったことは、以下のようにいくつかのライブラリ拡張を追加したことです。

    public static bool IsNonStringEnumerable(this PropertyInfo pi) {
        return pi != null && pi.PropertyType.IsNonStringEnumerable();
    }

    public static bool IsNonStringEnumerable(this object instance) {
        return instance != null && instance.GetType().IsNonStringEnumerable();
    }

    public static bool IsNonStringEnumerable(this Type type) {
        if (type == null || type == typeof(string))
            return false;
        return typeof(IEnumerable).IsAssignableFrom(type);
    }

どのように解決するのですか?

if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType) && prop.PropertyType != typeof(string))