假设我有一个名字和身份的人类和具有相同属性的动物类,我有一个人和动物的列表。现在我想创建一个方法来返回该列表中的最后一个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
答案 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
也可以是interface
或abstract 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)