Есть ли способ найти родительский объект переменной, переданной функции?C#

Место общения программистов C#
Ответить
Anonymous
 Есть ли способ найти родительский объект переменной, переданной функции?

Сообщение Anonymous »

У меня есть стандартная система заполнения форм, использующая C# и JavaScript. Данные для формы поступают из класса C#.
Я обновляю систему, чтобы она могла создавать многостраничные формы (без необходимости вызывать C# для изменения страниц). Члены класса теперь имеют атрибуты, указывающие, на какой странице отображается каждое поле формы.
Когда форма передается из JavaScript в C#, она вызывает на сервере функцию C#, которая проверяет вход. Если введенные данные недействительны, возвращается сообщение об ошибке.
В настоящее время я использую функцию проверки, которая выдает исключение, если проверенное утверждение неверно. Было бы здорово, если бы функция проверки могла сообщить JavaScript, на какой странице находится поле с ошибкой. Я надеялся, что смогу передать значение поля в функцию проверки, и она волшебным образом сможет определить, из какого класса получено поле, найти номер страницы и передать его обратно.
Пример кода:
public class PageAttribute : Attribute {
public int Page;
public PageAttribute(int page) {
Page = page;
}
}

public class Example {
public int Id;
[Page(1)]
public string Name;
[Page(1)]
public string Address;
[Page(2)]
public int Calls;
[Page(2)]
public int Emails;
}

public class CheckException : ApplicationException {
public int Page;
public CheckException(string message, int page = 0) : base(message) {
Page = page;
}
}

void Check(Object o, T item, Func validate, string message) {
if (!validate(item)) {
Type type = o.GetType();
// Somehow magically find out which element in object o item comes from
string name = "Calls";
MemberInfo info = type.GetField(name) as MemberInfo;
PageAttribute p = info.GetCustomAttribute(typeof(PageAttribute)) as PageAttribute;
throw new CheckException(message, p == null ? 0 : p.Page);
}
}

void Main() {
Example e = new Example() { Id = 1, Name = "test", Calls = 3 };
Check(e, e.Calls, x => x == 3, "Calls not equal to 3");
Check(e, e.Calls, x => x == 2, "Calls not equal to 2");
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... a-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»