C#:如何判断对象是自定义类还是本机类型/.NET类
本文关键字:自定义 类型 NET 本机 对象 何判断 判断 | 更新日期: 2023-09-27 17:59:29
我有这个类
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
{
...
}
}
}
不确定性能,但您可以使用类似的东西
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.对象的列表,并检查您的项目对象是否在该列表中。
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
}
}
您必须在预定义的哈希表或字典中查找它。。。例如,枚举作为.NET Framework SDK一部分的所有程序集,并将完全限定的名称存储在字典中。
我知道这是旧的,但我认为您正在寻找方法
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);
}
}