12

私はこのクラスを持っています

public class MyViewModel {
  public MyClass Thing { get; set; }
  public int Id { get { return Thing.Id; } }
  public string Name { get { return Thing.Name; } }
}

ASP.NET GridView にバインドすると、自動的に が省略されることに気付きましたThing。これには正当な理由があります (つまり、そうしないと、すべての行に無意味な "MyNamespace.MyClass" しか表示されないため)。

私はこの方法で同様のことをしようとしています。

public static string ConvertToCsv<T>(IEnumerable<T> items)
{
  foreach (T item in items)
  {
    if(item is not a native/.NET class) // <-- How do you do this?
      continue;
    else // If it is a string/int/bool/DateTime or something meaningful
    {
      ...
    }
  }
}
4

3 に答える 3

17

パフォーマンスについてはわかりませんが、次のようなものを使用できます

if(item.GetType().Namespace.StartsWith("System")) 
{
   // do stuff
}

またはループする前にフィルタリングする

public static string ConvertToCsv<T>(IEnumerable<T> items)
{
    foreach (T item in items.Where(i => i.GetType().Namespace.StartsWith("System")))
    {

    }
}

編集:簡単なテストの後、上記のメソッドにはいくつかの欠陥があります。オブジェクトが null 可能 (MyViewModel?) の場合、このチェックで検出されます ( System.Nullable<MyViewModel>)。

したがって、おそらく次のように使用できます。

public static string ConvertToCsv<T>(IEnumerable<T> items)
{
    foreach (T item in items.Where(i => i.GetType().Module.ScopeName.Equals("CommonLanguageRuntimeLibrary")))
    {

    }
}

別の編集: 最後の方法にも問題があるようです. しかし、以下の方法は断然最速で信頼性が高いです. アセンブリから System.Objects のリストを作成し、項目オブジェクトが含まれているかどうかを確認するだけです.そのリスト。

private List<Type> _systemTypes;
public List<Type> SystemTypes
{
    get
    {
        if (_systemTypes == null)
        {
            _systemTypes = Assembly.GetExecutingAssembly().GetType().Module.Assembly.GetExportedTypes().ToList();
        }
        return _systemTypes;
    }
}

public static string ConvertToCsv<T>(IEnumerable<T> items)
{
    foreach (T item in items.Where(i => SystemTypes.Contains(i.GetType())))
    {
         // is system type
    }
}
于 2013-02-14T03:28:38.337 に答える
0

定義済みのハッシュ テーブルまたはディクショナリで検索する必要があります。たとえば、.NET Framework SDK の一部であるすべてのアセンブリを列挙し、完全修飾名をディクショナリに格納します。

于 2013-02-14T03:29:06.640 に答える
0

これが古いことは知っていますが、メソッドを探していると思います。

Type type = result.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
    string prs = property.GetMethod.ToString();
    if(!prs.StartsWith("System"))
    {
        //IS CLass
    } else {
       Console.WriteLine(property.Name + ":::" + property.Value);
    }
}
于 2016-05-11T19:33:07.053 に答える