2013-02-14 15 views
8

Ben bir ASP.NET GridView bağlamak geçince fark ettimC#: Bir nesnenin özel bir sınıf mı yoksa yerel tür/.NET sınıfı mı olduğunu nasıl anlarsınız?

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

bu sınıf var, otomatik olarak Thing atlar ve iyi bir neden için (yani. Aksi takdirde sadece anlamsız "MyNamespace gösterecektir çünkü. MyClass "tüm satırlarda"

Bu yöntemde benzer bir şey yapmaya çalışıyorum.

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

olası yinelenen (http://stackoverflow.com/questions/367761/how-to-determine [Bir DLL yönetilen bir montaj veya yerli olup olmadığını (bir yerli dll yüklenirken önlemek)? Nasıl belirlenir] -yeni-bir-dll-bir-yönetilen-montaj-veya-yerli-ön yükleme-yükleme) - en yüksek puanlama cevabı kontrol edin –

+0

Teşekkürler Jeremy ama dosyaları veya DLL hakkında konuşmuyor değilim – Aximili

cevap

11
performansı hakkında emin

değil ama

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

    } 
} 

Düzenleme döngü önce

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

Veya filtre çizgisinde Somthing kullanabilirsiniz: Hızlı bir testte yukarıdaki yöntem sonrasında bazı kusurları vardır, Nesneniz null (MyViewModel?) ise, bu kontrolde (System.Nullable<MyViewModel>) alınacaktır.

Yani belki kullanabilirsiniz:

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

    } 
} 

başka düzenleme: da geçen yöntemle bazı sorun var gibi gözüküyor, ama aşağıda bu kadar hızlı ve en güvenilir olan, Sadece Assembly'den System.Objects listesini oluşturun ve öğe nesnesinin bu listede olup olmadığını kontrol edin.

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

İkincisi daha zarif imo –

+0

Neden sadece isim alanlarını saklamıyor musunuz? Daha hızlı olabilirdi. Büyük örnek olsa da. – Edgar

+0

'typeof (Assembly)' yerine Assembly.GetExecutingAssembly(). GetType(). Modül 'daha zarif görünüyor ve aynı. Tam satır, '_systemTypes = typeof (Assembly) .Assembly.GetExportedTypes() ToList();' Dahası, hangi Türün burada hedefleme için kullanıldığı daha nettir. Mscorlib'in yanı sıra başka meclislerde de kolayca kullanılabilir. –

0

Sen önceden tanımlanmış bir karma tablo veya SözIüğe bakmak zorunda kalacak ... diyelim .NET Framework SDK parçası olan tüm meclisleri numaralandırma ve bir sözlükte tam adı depolayarak.

0

Bunun eski olduğunu biliyorum, ama Metodu arıyorsunuz.

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); 
    } 
} 
ait
İlgili konular