2016-08-20 3 views
-4

Есть ли способ получить доступ к частному конструктору от контроллера к модели?
контроллер, содержащий метод вызова модели выглядит следующим образом:Как получить доступ к частному конструктору от контроллера к классу модели в mvc 4

public ActionResult ReadXML() 
{ 
    XmlSerializer reader = new XmlSerializer(typeof(List<Asseted>)); 
    TextReader textReader = new StreamReader(@"D:\Tial2.xml"); 
    List<Asseted> asseted; 
    List<Asseted> list = new List<Asseted>(); 
    asseted = (List<Asseted>)reader.Deserialize(textReader); 
    textReader.Close(); 
    for (int i = 0; i < asseted.Count; i++) 
    { 
     string data123 = Convert.ToString(asseted[i].PopertyValue); 
     string data234 = Convert.ToString(asseted[i].PropertyName); 
     list.Add(new Asseted(data123,data234)); 

    } 
    return View(); 
} 

модель, содержащая метод будет называться выглядит следующим образом:

[XmlRoot] 
public class Asseted 
{ 
    string pName, pValue; 
    private string data234; 
    private string data123; 

    private Asseted(string data234, string data123) 
    { 
     // TODO: Complete member initialization 
     PropertyName = data234; 
     PopertyValue = data123; 
    } 
    [XmlElement] 
    public string PropertyName { get; set; } 

    [XmlElement] 
    public string PopertyValue { get; set; } 
} 
+1

Зачем вам нужен частный конструктор в вашем классе Asseted? –

+0

Потому что я хочу напечатать пару имя/значение из контроллера для просмотра в виде списка как строки –

+1

Короткий ответ - нет (частный означает частный для самого класса). Но какова точка вашего цикла. Ваш 'asseted = (List ) reader.Deserialize (textReader);' code уже создает коллекцию. В чем смысл создания другой идентичной коллекции? И почему вы используете 'string data123 = Convert.ToString (asseted [i] .PopertyValue);' для преобразования 'string' в другую' string' (его уже 'string') –

ответ

2

Есть ли способ, чтобы получить доступ закрытого конструктора от контроллера к модели?

Хотя это может быть спорно, если это право способ решить вашу проблему, сам вопрос можно ответить ДА. И это даже не очень сложно с отражением.

ConstructorInfo constructor = typeof(Asseted).GetConstructor(
    BindingFlags.NonPublic | BindingFlags.Instance, 
    null, 
    new[] { typeof(string), typeof(string) }, 
    null); 

Asseted instance = constructor.Invoke(new[] { 
    "data234", 
    "data123" 
}) as Asseted; 

В основном вы получаете тип (Asseted), получить конструктор, который соответствует вашим известным типам параметров и вызывать его. Готово.

Дополнительная информация: В зависимости от вашего компилятора и фактического кода вы можете столкнуться с TypeAccessException.