【问题标题】:Passing object attribute to method parameter C#将对象属性传递给方法参数C#
【发布时间】:2016-10-29 11:59:36
【问题描述】:

假设我有一个具有名称和 id 的人员类和一个具有相同属性的动物类,并且我有一个包含人员和动物的列表。现在我想创建一个方法来从该列表中返回最后一个 id 并增加它。我想让它成为通用的,以便我以后可以使用它。

public static int getNextId(List<Object>param)
{
    int lastId = Int32.Parse(param[param.Count - 1].id);
    if (lastId!=0)
    {
        return lastId++;
    }
    return 0;
}

但“id”有下划线,因为对象没有 id。

编辑:

python 中类似的东西

def someMethod(self, someList, attr):
    objAttr = getattr(someObject, attr)
    for(item in someList):
        return item.objAttr

【问题讨论】:

    标签: c# object methods


    【解决方案1】:

    您的方法不是在 C# 等静态类型语言中处理此类内容的方式。您只能访问在特定类型上声明的属性/字段。而object 没有名为id 的公共字段或属性。

    有一些方法可以解决这个问题:一种方法是拥有一个基类,该基类具有 id 属性,您的其他类可以从该属性继承:

    public class IdHolder
    {
        public int Id { get; set; }
    }
    
    public class Person : IdHolder
    {
        // Person inherits the 'Id' property from IdHolder
        // other properties unique to person...
    }
    

    IdHolder 也可以是 interfaceabstract class - 这取决于您的特定用例(请注意,如果您选择,您必须在每个实现类中实现 Id 属性使IdHolder成为一个接口)。

    如果您选择使用基类(或接口,...),您可以更改方法以接受它作为参数:

    public static int getNextId(List<IdHolder>param)
    {
        int lastId = param[param.Count - 1].Id;
        if (lastId!=0)
        {
            return lastId++;
        }
        return 0;
    }    
    

    另一个 - 有点脏 - 选项是使用反射。由于我认为这对您来说不是一条明智的路线,因此我不会在这里进一步讨论。

    我建议您看一下 C# 介绍书,因为您的代码的其他一些方面并未真正遵循 C# 准则(例如,使用 camelCase 而不是 PascalCase)。

    【讨论】:

    • 谢谢,我想我很困惑,因为在 python 中你可以将对象属性作为参数传递给方法。
    【解决方案2】:

    使用这样的 Id 属性创建一个 Person 类:

    public class Person
    {
         public int Id {get; set;}
    }
    

    所以你可以使用:

    public static int getNextId(List<Person>param)
    {
        int lastId = param.Last().Id;
        if (lastId!=0)
        {
            return lastId++;
        }
        return 0;
    }
    

    另一种方法是使用接口来实现“通用”,就像你说的那样:

    public interface IId
    {
         int Id {get;set;}
    }
    
    public class Person : IId
    {
         public int Id {get; set;}
    }
    
    public static int getNextId(List<IId>param)
    {
        int lastId = param.Last().Id;
        if (lastId!=0)
        {
            return lastId++;
        }
        return 0;
    }
    

    【讨论】:

      【解决方案3】:
      public static int GetNextId(List<object> param)
      {
          int id = param.OfType<Person>().Last().Id;
          return ++id;
      }
      

      OfType 方法根据指定的类型过滤元素。只会从人和动物列表中过滤掉人。

      Last 方法返回序列的最后一个元素。

      【讨论】:

        猜你喜欢
        • 2021-02-05
        • 2017-06-21
        • 2011-06-30
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2013-06-26
        • 2013-02-08
        • 1970-01-01
        相关资源
        最近更新 更多