Я хотел бы создать собственный атрибут для применения к любому методу в классе, а затем, вне этого класса, получить доступ к методу внутри класса, который был «помечен» атрибутом, чтобы вызвать метод с меткой как если бы это был делегат.
, например
public delegate string MethodCall( string args);
и
public class MethodAttribute : System.Attribute
{
public MethodCall callback;
...
}
и
class TypeWithCustomAttributesApplied {
[Method]
public string DelegateMethod(string args) {
...
}
}
, а затем
void callMethods(string args) {
TypeWithCustomAttributesApplied myObj = new TypeWithCustomAttributesApplied();
DelegateMethod method = MyCustomerHelper.GetMarkedMethod(myObj)
method(args);
}
или, возможно,
void callMethods(string args) {
TypeWithCustomAttributesApplied myObj = new TypeWithCustomAttributesApplied();
MethodAttribute methodAtrib = MyCustomerHelper.GetMarkedMethod(myObj)
methodAtrib.callback(args);
}
В конечном итоге я пытаюсь добиться пользовательского атрибута, который я могу использовать для «пометки» точек входа Ajax в произвольных классах, а затем с помощью вспомогательного класса передать элемент управления «Ajax Enabled» помощнику, который определяет, какой метод в элементе управления для вызова и передает ему данные ajax от клиента. В любом случае, я не очень хорош с делегатами, но в целом я понимаю, как применять пользовательские атрибуты, но не уверен, как «захватить» метод, который я «помечаю»
Возможно, я мог бы справиться со своей задачей другим способом, но я пробую свои силы в атрибутах, поэтому я бы хотел, чтобы этот метод работал первым.
Мое окончательное решение:
public void CheckAjax(object anObject, string args)
{
MethodInfo[] methods = anObject.GetType().GetMethods();
foreach (MethodInfo method in methods)
{
object[] attributes = method.GetCustomAttributes(true);
bool containsAttribute = (from attribute in attributes
where attribute is AjaxableAttribute
select attribute).Count() > 0;
if (containsAttribute)
{
string result_method = (string)method.Invoke(anObject, new object[] { args });
Log.Write(string.Format("The Result from the method call was {0} ", result_method));
}
}
}