将对象属性传递给方法参数C#

时间:2016-10-29 11:59:36

标签: c# object methods

假设我有一个名字和身份的人类和具有相同属性的动物类,我有一个人和动物的列表。现在我想创建一个方法来返回该列表中的最后一个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'加下划线,因为object没有id。

修改

在python

中有类似的东西
def someMethod(self, someList, attr):
    objAttr = getattr(someObject, attr)
    for(item in someList):
        return item.objAttr

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

创建一个具有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;
}

另一个方法是使用接口来制作&#34;通用&#34;像你说的那样:

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;
}

答案 2 :(得分:0)

public static int GetNextId(List<object> param)
{
    int id = param.OfType<Person>().Last().Id;
    return ++id;
}

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

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