2013-02-14 239 views
8

我有這個類C#:如何判斷對象是自定義類還是本機類型/.NET類?

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 
    { 
     ... 
    } 
    } 
} 
+0

可能重複的[如何確定一個DLL是否是一個受管組件或天然的(防止加載機DLL)?](http://stackoverflow.com/questions/367761/how-to-determine - 是否是一個管理組裝或本機防止加載) - 檢查最高得分的答案 – 2013-02-14 03:29:44

+0

謝謝傑里米,但我不是在說文件或DLL – Aximili 2013-02-14 03:39:58

回答

11

不確定的表現,但你可以循環

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

    } 
} 

編輯之前沿着

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

或過濾器的線路使用的財產以後:快速測試上述方法後有一些缺陷,如果你的對象是可空的(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"))) 
    { 

    } 
} 

另一個編輯: 似乎有是一些問題與過去的方法還可以,但在這之下是迄今爲止最快,最可靠的,我們只是從Assembly中創建System.Objects的列表,並檢查您的item對象是否在該列表中。

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 
    } 
} 
+1

你的後者更優雅imo – 2013-02-14 03:37:02

+0

爲什麼不只存儲名稱空間?它可以變得更快。大樣本雖然。 – Edgar 2016-07-08 21:46:51

+0

'typeof(Assembly)'而不是'Assembly.GetExecutingAssembly()。GetType()。Module'看起來更優雅,並且做同樣的事情。全部行將是'_systemTypes = typeof(Assembly).Assembly.GetExportedTypes()。ToList();'不僅如此,它更清楚哪種類型用於在這裏定位。除了mscorlib之外,還可以輕鬆地用於其他程序集的窺視。 – 2017-02-09 11:44:54

0

你必須看它在一個預定義的哈希表或字典...比如說通過枚舉所有在.NET Framework SDK中的一部分組件,並在字典中存儲的全名。

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); 
    } 
} 
相關問題