12

我有这门课

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
    {
      ...
    }
  }
}
4

3 回答 3

17

不确定性能,但你可以使用类似的东西

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
    }
}
于 2013-02-14T03:28:38.337 回答
0

您必须在预定义的哈希表或字典中查找它……例如,通过枚举所有属于 .NET Framework SDK 的程序集并将完全限定名称存储在字典中。

于 2013-02-14T03:29:06.640 回答
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);
    }
}
于 2016-05-11T19:33:07.053 回答