Ответ 1
Я отправлю свой ответ из CodePlex Discussion здесь:
Я не уверен, что в настоящее время это возможно. Когда вы используете кодовые блоки (@{}), вы на самом деле пишете код внутри метода, например. ваш выше код будет делать что-то вроде:
public void Execute()
{
this.Clear();
public class MyClass {
public MyClass() {
Three = new List<string>();
}
public string One { get; set; }
public int Two { get; set; }
public List<string> Three { get; set;}
}
}
... что, конечно, недействительно С#. Другая проблема, с которой вы столкнетесь, заключается в том, что для использования сериализации/десериализации XML-массива тип должен быть известен, но если вы определяете свой тип внутри самого шаблона, как бы вы могли его десериализировать в первую очередь?
Что вы можете сделать, это использовать настраиваемый базовый шаблон:
public class CustomTemplateBase<T> : TemplateBase<T>
{
public dynamic Instance { get; set; }
public dynamic CreateInstance(string typeName)
{
Type type = Type.GetType(typeName);
// You'd to your deserialisation here, I'm going to
// just cheat and return a new instance.
return Activator.CreateInstance(type);
}
}
Используя динамическое свойство и динамический тип возвращаемого значения, мы определили метод, который позволит нам создать экземпляр (посредством активации или десериализации и т.д.) и получить доступ к нему. Чтобы использовать это в шаблоне, вы можете:
@{
Instance = CreateInstance("ConsoleApplication1.MyClass, ConsoleApplication1");
Instance.One = "Hello World";
}
<h1>@Instance.One</h1>
Где "MyClass" определен где-то в моем приложении. Важно то, что я создаю экземпляр для каждого шаблона.