2016-11-20 5 views
0

Учитывая, что по умолчанию conditional attribute в C# работает только с void методами, я пытаюсь создать свой собственный.пытается создать пользовательский условный атрибут в C#

мой код ниже доступен: в http://ideone.com/FSOMKi, а я не получил ошибки comiler, но выглядит что-то пошло не так здесь :(

using System; 
using System.Collections.Generic; // for HashSet 
using System.Linq; // for using Where 
using System.Reflection; 

namespace attribute 
{ 
public class Test 
{ 
    public static void Main() 
    { 
     var targetClasses = new HashSet<string>(new[] { "Foo", "Foo2" }); 
     var targetFns = new HashSet<string>(new[] { "fn", "fn2", "fn3" }); 

     foreach (var target in targetClasses){ 
      foreach(var fn in targetFns){ 
       var method = (target.GetType().GetTypeInfo()) // (typeof(Foo).GetTypeInfo()) 
       .DeclaredMethods.Where(x => x.Name == fn).FirstOrDefault(); 
       if (method != null) //return 0; 
       { 
       var customAttributes = (MyCustomAttribute[])method 
             .GetCustomAttributes(typeof(MyCustomAttribute), true); 
      if (customAttributes.Length > 0) 
      { 
       var myAttribute = customAttributes[0]; 
       bool value = myAttribute.condition; 
       Console.WriteLine(value); 
       if (value == true) 
        method.Invoke(null, null); 
       else 
        Console.WriteLine("The attribute parameter is not as required"); 
      } 
       } 
     } 
     } 
    } 
} 
} 


namespace attribute 
{ 
    [AttributeUsage(AttributeTargets.All)] 
    public class MyCustomAttribute : Attribute 
    { 
     public bool condition { get; set; } 
    } 


    public class Foo 
    { 
     [MyCustom(condition= true ? ("bar" == "bar") : false)] 
     internal static void fn() 
     { 
      Console.WriteLine("a function in a class"); 
     } 

     [MyCustom(condition= true ? (1 == 2) : false)] 
     internal static void fn2() 
     { 
      Console.WriteLine("another function in the same class"); 
     } 
    } 

    public class Foo2 
    { 
     [MyCustom(condition= true ? (1 == 1) : false)] 
     internal static void fn2() 
     { 
      Console.WriteLine("another function in a nother class"); 
     } 
    } 
} 

Выход должен быть в три линии, как показано ниже:

Фуная в классе параметр атрибута не требуется, как другая функция в классе руги

+2

Пожалуйста, прочитайте [ask] и объясните, что вы ожидаете от этого кода, что он делает или не делает, и что вы пытались решить. – CodeCaster

ответ

1

Ваш вопрос требует много рефакторинга.

Однако, исходя из того, что я понял, вы создаете специальный условный атрибут, и компилятор, похоже, не знает об этом.

Проблема в вашем подходе состоит в том, что существующий ConditionalAttribute является особым случаем в смысле, который компилятор C# знает об этом. Компилятор выполняет специальное компиляционное действие, когда метод, который вызывается, украшен этим атрибутом.

В этом отношении вы не можете определить другой условный атрибут просто потому, что компилятор не будет знать о его значении.

Относительно примечания ConditionalAttribute не может применяться к методу, возвращающему не-void, потому что его приложение указывает компилятору, чтобы удалить вызов метода. Единственный способ, с помощью которого вы можете пропустить вызов, - это метод, от которого вы ничего не ожидаете - это методы, возвращающие void и не имеющие параметров out.

+0

Кроме того, этот класс «запечатан», поэтому невозможно расширить его поведение (что имеет смысл по причинам, указанным в вашем сообщении). – Bidou

+0

@Bidou Точно. Все поведение, связанное с этим классом, встроено в компилятор, что не оставляет места для настройки. –

+0

Спасибо за взрыв. –

Смежные вопросы