2015-02-25 4 views
0

У меня есть это:Динамический класса на основе параметра строки

public class Blah 
    { 
     public int id { get; set; } 
     public string blahh { get; set; } 
    } 

    public class Doh 
    { 
     public int id { get; set; } 
     public string dohh { get; set; } 
     public string mahh { get; set; } 
    } 

    public List<???prpClass???> Whatever(string prpClass) 

где строка prpClass может быть «Л» или «Doh».

Я бы хотел, чтобы тип List был классом Blah или Doh на основе строки prpClass.

Как я могу это достичь?

EDIT:

public List<prpClass??> Whatever(string prpClass) 
    { 
     using (var ctx = new ApplicationDbContext()) 
     { 
      if (prpClass == "Blah") 
      { 
       string queryBlah = @"SELECT ... "; 

       var result = ctx.Database.SqlQuery<Blah>(queryBlah).ToList(); 

       return result; 
      } 
      if (prpClass == "Doh") 
      { 
       string queryDoh = @"SELECT ... "; 

       var result = ctx.Database.SqlQuery<Doh>(queryDoh).ToList(); 

       return result; 
      } 

      return null 
     } 
    } 
+0

Они должны иметь общего предка, как базовый класс или интерфейс. – ja72

+0

Обновлен мой ответ ... то, что вы пытаетесь сделать, невозможно досадно. –

+0

@Tomo угловой js работает с json справа? но какие серверные технологии вы используете? –

ответ

3

вы должны иметь общую супертип:

public interface IHaveAnId 
{ 
     int id { get;set; } 
} 

public class Blah : IHaveAnId 
{ 
    public int id { get; set; } 
    public string blahh { get; set; } 
} 

public class Doh : IHaveAnId 
{ 
    public int id {get;set;} 
    public string dohh { get; set; } 
    public string mahh { get; set; } 
} 

, то вы можете сделать:

public List<IHaveAnId> TheList = new List<IHaveAnId>(); 

и в какой-то метод:

TheList.Add(new Blah{id=1,blahh = "someValue"}); 
TheList.Add(new Doh{id =2, dohh = "someValue", mahh = "someotherValue"}); 

перебирать список:

foreach(IHaveAnId item in TheList) 
{ 
    Console.WriteLine("TheList contains an item with id {0}", item.id); 
    //item.id is allowed since you access the property of the class over the interface 
} 

или перебрать все вздор:

foreach(Blah item in TheList.OfType<Blah>()) 
{ 
    Console.WriteLine("TheList contains a Blah with id {0} and blahh ='{1}'", item.id, item.blahh); 
} 

Edit:

эти 2 методы и ИНТ поле, содержащее Автозначение:

private int autoValue = 0;  

public void AddBlah(string blahh) 
{ 
     TheList.Add(new Blah{id = autovalue++, blahh = blahh}); 
} 

public void AddDoh(string dohh, string mahh) 
{ 
     TheList.Add(new Doh{id = autovalue++, dohh = dohh, mahh = mahh}); 
} 

Другой Редактировать

public List<object> Whatever(string prpClass) 
{ 
    using (var ctx = new ApplicationDbContext()) 
    { 
     if (prpClass == "Blah") 
     { 
      string queryBlah = @"SELECT ... "; 

      var result = ctx.Database.SqlQuery<Blah>(queryBlah).ToList(); 

      return result.Cast<object>().ToList(); 
     } 
     if (prpClass == "Doh") 
     { 
      string queryDoh = @"SELECT ... "; 

      var result = ctx.Database.SqlQuery<Doh>(queryDoh).ToList(); 

      return result.Cast<object>.ToList(); 
     } 

     return null; 
    } 
} 

в представлении вы тогда должны решить, какой тип он. В asp.net MVC вы можете использовать шаблон отображения и использовать отражение, чтобы получить хороший дизайн. Но тогда я до сих пор не знаю, какую технологию вы используете.

Еще один Редактировать

TestClass:

public class SomeClass 
{ 
    public string Property { get; set; } 
} 

Repository:

public static class Repository 
{ 
    public static List<object> Whatever(string prpClass) 
    { 
     switch (prpClass) 
     { 
      case "SomeClass": 
       return new List<SomeClass>() 
       { 
        new SomeClass{Property = "somestring"}, 
        new SomeClass{Property = "someOtherString"} 
       }.Cast<object>().ToList(); 
      default: 
       return null; 

     } 
    } 
} 

И действие контроллера в MVC:

public JsonResult Test(string className) 
{ 
    return Json(Repository.Whatever("SomeClass"),JsonRequestBehavior.AllowGet); 
} 

тогда я назвал его: http://localhost:56619/Home/Test?className=SomeClass

И получил результат:

[{"Property":"somestring"},{"Property":"someOtherString"}] 
+0

Я не вижу связи между вашим кодом и строкой prpClass. – Tomo

+0

У меня есть запрос из браузера и на основе того, что находится в prpClass, я хотел бы получить некоторые данные и отправить их обратно в браузер. У меня есть дюжина классов, таких как Бла и Дох. То, что я хочу достичь, - это строка prpClass = «Blah», затем public List Что бы ни (строка prpClass), если строка prpClass = «Doh», то public List Что бы ни (строка prpClass) и т. Д. Я мог бы дублировать мой код дюжину раз, но это было бы не смешно. – Tomo

+0

Итак, вы получаете доступ к базе данных? –

0

Является ли это то, что вы пытаетесь сделать?

public class Blah 
{ 
    public int id { get; set; } 
    public string blahh { get; set; } 
} 

public class Doh 
{ 
    public int id { get; set; } 
    public string dohh { get; set; } 
    public string mahh { get; set; } 
} 

class Program 
{ 
    public static List<T> Whatever<T>(int count) where T: new() 
    { 
     return Enumerable.Range(0, count).Select((i) => new T()).ToList(); 
    } 

    static void Main(string[] args) 
    { 
     var list=Whatever<Doh>(100); 
     // list containts 100 of "Doh" 
    } 
} 
+0

у него есть более серьезная проблема ... читать комментарии под моим ответом ... –

+0

вопрос довольно от его актуальной проблемы тоже ... –

+0

Я добавил код. Надеюсь, это сделает вещи более ясными. – Tomo