2016-10-29 3 views
0

にオブジェクト属性を渡す私は、名前とIDを持つpersonクラスと同じ属性を持つ動物クラスがあり、人と動物のリストがあるとします。今私はそのリストから最後のIDを返すメソッドを作成し、それを増やしたいと思います。私はそれを普遍的なものにしたいので、後でそれを使うことができます。メソッドパラメータC#

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 

答えて

1

あなたのアプローチを使用して、C#などの静的型付け言語ではこのようなものを処理する方法ではありません。特定のタイプで宣言されているプロパティ/フィールドにしかアクセスできません。 objectには、idというパブリックフィールドまたはプロパティがありません。

そこには、この周りにいくつかの方法があります:1つは他のクラスが継承する可能性があるから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可能性 - あなたの特定のユースケースに依存します(IdHolderをインタフェースにすることを選択した場合は、各実装クラスにIdプロパティを実装する必要があります)。あなたは、基本クラス持つことを選択した場合

は(またはインタフェースを、...)あなたは、パラメータとしてそれを受け入れるためにあなたの方法を変更したい: - 少し汚れ -

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

別のオプションは、リフレクションを使用することです。これがあなたが取るべき賢明な道だとは思わないので、ここではこれ以上は進めません。

実際にC#のガイドラインに従わない(たとえば、PascalCaseの代わりにcamelCaseを使用する)コードのいくつかの側面があるので、C#へのイントロの本を見ることをお勧めします。

+0

私は混乱していたと思います。なぜなら、Pythonでは、オブジェクト属性をメソッドのパラメータとして渡すことができるからです。 – Zozo

0

このようなIdをプロパティを持つPersonクラスを作成します。

:あなたが言ったように別のaproachは、 "ユニバーサル" にするためにインターフェースを使用している

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

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

をあなたが使用することができます

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; 
} 
0
public static int GetNextId(List<object> param) 
{ 
    int id = param.OfType<Person>().Last().Id; 
    return ++id; 
} 

OfTypeメソッドは、指定された型に基づいて要素をフィルタリングします。人々だけが人々や動物のリストから除外されます。

Lastメソッドは、シーケンスの最後の要素を返します。

関連する問題