gpt4 book ai didi

C#:如何判断对象是自定义类还是 native 类型/.NET 类?

转载 作者:太空狗 更新时间:2023-10-29 17:43:29 27 4
gpt4 key购买 nike

我有这门课

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

我注意到当我将它绑定(bind)到 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")))
{

}
}

编辑:经过快速测试后,上述方法存在一些缺陷,如果您的对象可以为空(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
}
}

关于C#:如何判断对象是自定义类还是 native 类型/.NET 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14867297/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com