【问题标题】:How to get generic property but ignore its type?如何获得通用属性但忽略其类型?
【发布时间】:2019-09-08 23:36:23
【问题描述】:

我有一个本质上是键值对的结构。我有另一个类,它具有这些 MyStruct 的多个属性(键是字符串,值是 T)或其他类型。我想获取所有属性并在值上调用它们的 ToString 函数,例如

foreach (var prop in AllTheProperties)
{
  if (prop.GetType() is typeof(MyStruct<ignoreMe>)
  {
   yield return prop.Key;
   yield return prop.Value.ToString();
   }
}

但我卡住的地方是打字部分。我不想获取所有类型字符串,然后键入 int 等。如何忽略类型? (附带说明,这将被移植到 VB,但我更喜欢先在 c# 中做一些事情)。

【问题讨论】:

  • 您可能希望添加 (1) MyStruct 代码和 (2) 至少类似于包含 MyStruct 属性的“其他类”的代码看起来像您的问题。
  • 我已经删除了你的 Vb.Net 标签,因为问题在 C# 中

标签: c# .net generics reflection


【解决方案1】:

如果您所追求的只是确保使用的泛型类型是 MyStruct 而与 T 无关,那么您只需比较泛型类型定义。

Type propType = prop.GetType();
if(propType.IsGenericType && propType.GetGenericTypeDefinition() == typeof(MyStruct<>))
{
    //Do work
}

如果 MyStruct 类型的对象与泛型类型参数无关,这将始终返回 true。

信用:-How to get base class's generic type parameter?

【讨论】:

    【解决方案2】:

    我将为您的MyStruct&lt;T&gt; 对象分配一个接口,该接口具有string Key 的属性和object ObjectValue 的只读属性。然后我会在ObjectValue 属性的实现中返回Value。这是一个例子:

    public interface GenericMyStruct
    {
        string Key { get; set; }
    
        object ObjectValue { get; }
    }
    
    public class MyStruct<T> : GenericMyStruct
    {
        public string Key { get; set; }
    
        public T Value { get; set; }
    
        public object ObjectValue { get { return (object)Value; } }
    }
    

    写出所有属性的代码将如下所示:

    foreach (var prop in AllTheProperties)
    {
        if (prop is GenericMyStruct)
        {
            yield return prop.Key;
            yield return prop.ObjectValue.ToString();
        }
    }   
    

    【讨论】:

    • 非常感谢。我选择了这个解决方案;如果有疑问,请使用接口,我猜 :)
    【解决方案3】:

    使用这种方法。它使用反射和 LINQ 来调用任何对象数组的所有公共属性的 ToString。

        public static IEnumerable<string> GetAllPropsAsStrings(object[] objs)
        {
            return from obj in objs from prop in obj.GetType().GetProperties() select prop.GetValue(obj).ToString();
        }
    

    使用两个不同键值对的示例用法,但这也适用于您自己的自定义结构:

            KeyValuePair<string, int> blah = new KeyValuePair<string, int>("hello", 42);
            KeyValuePair<int, int> blah2 = new KeyValuePair<int, int>(22, 42);
    
            var stringarray = GetAllPropsAsStrings(new object[] {blah, blah2});
            foreach (string str in stringarray)
            {
                Console.WriteLine(str);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多