Axi*_*ili 11 .net c# types class
我有这门课
public class MyViewModel {
public MyClass Thing { get; set; }
public int Id { get { return Thing.Id; } }
public string Name { get { return Thing.Name; } }
}
Run Code Online (Sandbox Code Playgroud)
我注意到当我将它绑定到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
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
sa_*_*213 14
不确定性能,但你可以使用类似的东西
if(item.GetType().Namespace.StartsWith("System"))
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
或者在循环之前过滤
public static string ConvertToCsv<T>(IEnumerable<T> items)
{
foreach (T item in items.Where(i => i.GetType().Namespace.StartsWith("System")))
{
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:快速测试后,上面的方法有一些缺陷,如果您的对象可以为空(MyViewModel?),它将在此check(System.Nullable<MyViewModel>)中被选中.
所以也许你可以使用:
public static string ConvertToCsv<T>(IEnumerable<T> items)
{
foreach (T item in items.Where(i => i.GetType().Module.ScopeName.Equals("CommonLanguageRuntimeLibrary")))
{
}
}
Run Code Online (Sandbox Code Playgroud)
另一个编辑: 最后一个方法似乎也存在一些问题,但下面这个是最快最可靠的,我们只是从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
}
}
Run Code Online (Sandbox Code Playgroud)