2011-12-06 10 views
4

BuildTypesメソッドで投影されたリストをキャストしようとすると、null値のリストが取得されます。私も.Cast()を使ってみましたが、いくつかのプロパティをキャストできないというエラーが出ます。私はそれが役に立つ場合は、エラーを投稿することができます。ここに私のコードは次のとおりです。LINQを使用して投影リストをキャストすると、ヌル値のリストが返されますか?

public class AuditActionType: EntityValueType 
{ 
} 

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType 
{ 
    var types = 
     (from ty in xDocument.Descendants("RECORD") 
     select new 
      { 
       Id = GenerateGuid(), 
       Name = ty.Element("Name").Value, 
       EntityStatus = _activeEntityStatus, 
       DateCreated = DateTime.Now, 
       DateModified = DateTime.Now 
      } as T).ToList(); 

    return types; 
} 

だから私はこのようにそれを呼び出します。

var auditActorTypes = BuildTypes<AuditActorType>(auditActorTypesXml) 

私はXMLファイルからプルする必要がある種類のトンを持っているとのコードを複製する必要はありませんでした各タイプ。

答えて

7

匿名オブジェクトをタイプTとしてキャストしようとしていますが、これは実行できません。匿名型は、それが自身のユニークなタイプだと渡されたTに関連しない方法である。

代わりに、あなたはそれがデフォルトコンストラクタを必要とする意味するタイプTnew()制約を供給し、その後new T()代わりの作成を行うことができ新しい匿名型:

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType, new() 
{ 
    var types = 
     (from ty in xDocument.Descendants("RECORD") 
     select new T() 
      { 
       Id = GenerateGuid(), 
       Name = ty.Element("Name").Value, 
       EntityStatus = _activeEntityStatus, 
       DateCreated = DateTime.Now, 
       DateModified = DateTime.Now 
      }).ToList(); 

    return types; 
} 

これはIdNameEntityStatusDateCreated、およびDateModifiedがベースEntityValueTypeのすべてのプロパティであることを、当然のことながら、想定しています。

+0

+1。しかし、 'Id' /' Name'/etcは 'EntityValueType'に存在する必要があることに言及する価値があります。 –

+0

@ J.Kommer:良い点。 –

1

変更コード:

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType, new() 
{ 
    var types = 
     (from ty in xDocument.Descendants("RECORD") 
     select new T() 
      { 
       Id = GenerateGuid(), 
       Name = ty.Element("Name").Value, 
       EntityStatus = _activeEntityStatus, 
       DateCreated = DateTime.Now, 
       DateModified = DateTime.Now 
      }).ToList(); 

    return types; 
} 
+1

あなたは新しい()制約が必要です –

+0

@James Michael Hare、@ DDiVita - はい、間違いました、あなたの点に感謝します。 –

+0

@RedHat:心配していない、それは小さい過ぎ越しだった、私はあなたがそれを意味すると思った:-)私は今、今+1するだろう。 –

4

new { }はT(それは子供でもない、またそれが型Tである)との関係がないanonymous typeを作成してあなたの現在のコードでこれを行うことはできません。

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType 

へ:

任意の型の引数は、私たちに渡されることを指定し
private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType, new() 

あなたが代わりに行うことができますことはあなたのEntityValueTypeクラスと変更のプロパティとしてIdNameEntityStatusDateCreatedDateModifiedを実装していますメソッドは、パラメータのないコンストラクタを持っていなければなりません。実際にタイプTのオブジェクトを一般的に以下のように変更することで使用できます。

select new { ... } as T 

へ:

select new T { ... } 

最終結果:それを私に暴行ため

public class EntityValueType 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    // Change this to the correct type, I was unable to determine the type from your code. 
    public string EntityStatus { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateModified { get; set; } 
} 

public class AuditActionType: EntityValueType 
{ 
} 

private List<T> BuildTypes<T>(XDocument xDocument) where T: EntityValueType, new() 
{ 
    return (from ty in xDocument.Descendants("RECORD") 
     select new T 
      { 
       Id = GenerateGuid(), 
       Name = ty.Element("Name").Value, 
       EntityStatus = _activeEntityStatus, 
       DateCreated = DateTime.Now, 
       DateModified = DateTime.Now 
      }).ToList(); 
} 
関連する問題