IEnumerable <T>のインスタンスでT型のプロパティ名を取得する

私はPersonクラスを持っています:

public class Person {

public long Id { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string PhoneNo { get; set; }
public string FaxNo { get; set; }
public int Age { get; set; }
public DateTime BirthDate { get; set; }

}

そして、このような人々のインスタンス:

IEnumerable people = new List() { /* Define people */ }

だから私は人の使用人のプロパティ名を取得する必要があります、もちろん私はこれを使用することができます:

string fr = people.FirstOrDefault().FirstName;

では、 people Person のインスタンスがない状況はどうですか? FirstName がないので、私たちが Person を持っていないときを知っていますが、ASP.NET MVCのリストビューでアクセスする必要があります。

  @Html.DisplayFor(model => model.LastName)

誰もそれについて考えていますか?

2

2 答え

people が空の場合、 FirstOrDefault()はnullを返すので、null参照例外が発生します。

ここでは必要なものがどういうものなのかはっきりしませんが、 null

string fr = people.Select(p => p.FirstName).FirstOrDefault();

これにより、最初のというプロジェクションが実行されます。したがって、 FirstOrDefault()は、人がいない場合、または最初の人の名さもないと。

3
追加された
@セイダッド:申し訳ありませんが、あなたがやろうとしていること、またはこれが空のコレクションとどう関係しているかは、本当にわかりません。
追加された 著者 Jon Skeet,
@Saeid:しかし、 FirstOrDefault()呼び出しはどこに入っていますか? どこにコードを置こうとしているのかは明確ではありません。 DisplayFor をどのように使いたいかを言ったが、それを試してみると何が起こるかは分からない... コレクションを表示している場合、コレクションが空の場合、値を表示しないでください...
追加された 著者 Jon Skeet,
MVCの編集、作成、または詳細ビューでは、このアプローチでもプロパティ名を表示するために@ Html.LabelFor(model => model.FirstName)を使用します。これは、DisplayName属性をプロパティの名前として表示できますが、タイプのIEnumerableを持っているので、このアプローチを使用することはできません。ListビューでDisplayまたはDisplayName属性を使用するのは面白いです。
追加された 著者 Saeid,
私が言ったように、MVCのリストビューでプロパティ名の表示を変更したいだけで、ビューに渡されたコレクションが空であったとは限りません。しかし、答えをありがとう
追加された 著者 Saeid,
私は、コレクションが空でないときにもそれを使うことができると知っていると言うために、 FirstOrDefault()に言及しました。これは正しいことです。コレクションが空であれば、しかし、値は必要ありません。 Display 属性のような属性で値を設定したい場合や、値が設定されている場合やNULLの場合はこの名前は値に関係しません。
追加された 著者 Saeid,

これは完全な答えではありませんが、私は空の Person インスタンスを定義して、次のように使用することができます。

@model IEnumerable
@{
ViewBag.Title = "Index";
YourNameSpace.Models.Person p = new YourNameSpace.Models.Person();
}

そして:

@Html.LabelFor(x => p.FirstName)
0
追加された