Как получить доступ к приватному конструктору из контроллера в модельный класс в MVC 4

c# asp.net-mvc-4 deserialization

391 просмотра

1 ответ

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

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; }
}
Автор: Sorangwala Abbasali Источник Размещён: 08.11.2019 11:06

Ответы (1)


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;

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

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

Автор: Manfred Radlwimmer Размещён: 08.09.2016 07:02
Вопросы из категории :
32x32