2012-02-21 16 views
0

私はプロパティ「AgeID」と「名前」、およびこのコードのクラスの年齢を持っている:MVC複数の類似モデル

public static MvcHtmlString AgeToCommaSeparated(this HtmlHelper htmlHelper, IEnumerable<Age> AgeList) 
    { 
     var sb = new StringBuilder(); 
     foreach (var age in AgeList) 
     { 
      sb.Append(age.Name); 
      sb.Append(","); 
     } 

     return new MvcHtmlString(sb.ToString().TrimEnd(',')); 
    } 

それから私は「GenderID」と性別のように、年齢に似他のクラスの多くを持っています「名前」と入力します。

AgeToCommaSeparated関数を汎用にして、どのクラスにも渡す方法はありますか?

答えて

0

は、なぜあなたは、共通のインタフェースを作成していない、このような何か:

public interface ICommaSeparable 
    { 
     string Chunk { get; set; } 
    } 

    public class Age : ICommaSeparable 
    { 
     public string Chunk { get { return AgeID; } } 
     public string Name { get; set; } 
     public int AgeID { get; set; } 
    } 

    public class Gender : ICommaSeparable 
    { 
     public string Chunk { get { return GenderID ; } } 
     public string Name { get; set; } 
     public int GenderID { get; set; } 
    } 

    public static MvcHtmlString AgeToCommaSeparated(this HtmlHelper htmlHelper, IEnumerable<ICommaSeparable> SeparableList) 
    { 
     var sb = new StringBuilder(); 
     foreach (var sep in SeparableList) 
     { 
      sb.Append(sep.Chunk); 
      sb.Append(","); 
     } 

     return new MvcHtmlString(sb.ToString().TrimEnd(',')); 
    } 
+0

GenderがGenderIDを使用し、AgeではIDの代わりにAgeIDを使用し、IDを参照する必要がありますAgeToCommaSeparated関数から? – user441365

+0

私はそこで使用されているインターフェイスにすべてを委任します。更新を参照してください。あなたが性別や年齢のクラスに触れることができない、またはしたくない場合は、リフレクションやAliostadの示唆を使用できます。 – pangabiMC

0

単にString.Joinを使用します。

String.Join(",", ageList.Select(x=>x.Name)); 

UPDATE

あなたが表現をコンパイルして実行するとコストがかかることをあなたの人生を容易なく、慎重にするためにこれを行うことができます(つまり、MVCは、とにかく何をするかですが、内部でキャッシュを使用しています):

public static class JoinExtensions 
{ 
    public static string Join<TModel, TProperty>(this IEnumerable<TModel> enumerable, Expression<Func<TModel, TProperty>> expression) 
    { 
     var compiled = expression.Compile(); 
     return string.Join(",", enumerable.Select(compiled)); 
    } 
} 


public class Age 
{ 
    public string Name { get; set; } 
} 

public class Gender 
{ 
    public string GenderId { get; set; } 
} 

これで、wri TE:

IEnumerable<Age> ages = new[] 
            { 
             new Age(){Name = "1"}, new Age(){Name = "2"}, new Age(){Name = "3"}, 
            }; 

Console.WriteLine(ages.Join(x => x.Name)); // outputs "1,2,3" 

あなたは、任意のクラスこのを使用することができます。たとえば:その後、

public class Gender 
{ 
    public string GenderId { get; set; } 
} 

そして:

IEnumerable<Gender> genders = new[] 
            { 
             new Gender(){GenderId = "16"}, new Gender(){GenderId = "22"}, new Gender(){GenderId = "35"}, 
            }; 

Console.WriteLine(genders.Join(x => x.GenderId)); 
+0

これは私が求めているものではありません。私はAgeToCommaSeparated関数にジェンダーを渡してそれを汎用にする方法があるかどうかを尋ねています – user441365

+0

私の更新を見てください – Aliostad

関連する問題