Следующее вычисляет отношение позиции мыши к элементу canvas:
var example = document.getElementById('example');
example.onmousemove = function(e) {
var x = e.pageX - this.offsetLeft;
var y = e.pageY - this.offsetTop;
}
В этом примере this
относится к элементу example
, а e
- событие onmousemove
.
Ну, я не могу ответить, почему это не доступно, но я могу подтверждать, что это не проблема CLI. Спецификация CLI не упоминает его (насколько я вижу), и если Вы используете IL непосредственно, можно создать универсальный атрибут. Часть спецификации C# 3, которая запрещает его - разделяет 10.1.4 "Спецификации основы класса", не дает выравнивания.
аннотируемая спецификация ECMA C# 2 не дает полезной информации также, хотя это действительно обеспечивает пример того, что не позволяется.
Моя копия аннотируемой спецификации C# 3 должна прибыть завтра... Я буду видеть, дает ли это больше информацию. Так или иначе это - определенно решение языка, а не во время выполнения.
РЕДАКТИРОВАНИЕ: Ответ от Eric Lippert (перефразировал): никакая конкретная причина, кроме избежать сложности и на языке и на компиляторе для варианта использования, который не добавляет много значения.
Атрибут украшает класс во время компиляции, но универсальный класс не получает свою заключительную информацию о типе до времени выполнения. Так как атрибут может влиять на компиляцию, это должно быть "завершено" во время компиляции.
Посмотрите этот статья MSDN для получения дополнительной информации.
Я не знаю, почему это не позволяется, но это - одно возможное обходное решение
[AttributeUsage(AttributeTargets.Class)]
public class ClassDescriptionAttribute : Attribute
{
public ClassDescriptionAttribute(Type KeyDataType)
{
_KeyDataType = KeyDataType;
}
public Type KeyDataType
{
get { return _KeyDataType; }
}
private Type _KeyDataType;
}
[ClassDescriptionAttribute(typeof(string))]
class Program
{
....
}
Это - очень хороший вопрос. По моему опыту, с атрибутами, я думаю, что ограничение существует потому что, когда размышляющий над атрибутом оно создало бы условие, в котором необходимо будет проверить на все возможные перестановки типа: typeof(Validates<string>)
, typeof(Validates<SomeCustomType>)
, и т.д.
, По-моему, если пользовательская проверка требуется в зависимости от типа, атрибут не может быть лучшим подходом.
, Возможно, класс проверки, который берет в SomeCustomValidationDelegate
или ISomeCustomValidator
в качестве параметра, был бы лучшим подходом.