Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从泛型类的特定实现中排除方面?_C#_Generics_Postsharp - Fatal编程技术网

C# 从泛型类的特定实现中排除方面?

C# 从泛型类的特定实现中排除方面?,c#,generics,postsharp,C#,Generics,Postsharp,假设我有一个泛型类: public abstract class MyClass<T> { // Contents } 不可能以声明方式应用泛型参数筛选。对于方面目标的高级筛选,您可以覆盖方面上的方法并以编程方式进行筛选 然而,在您描述的情况下,即使这样也不够。假设您已将方面应用于MyClass中的一个方法。在编译的这一点上,T还不知道,所以不可能执行检查。当在代码中的其他地方声明MyClass的字段或变量时,具体的T是已知的 在您的案例中,我看到的最佳选择是为目标类的每个

假设我有一个泛型类:

public abstract class MyClass<T> {
    // Contents
}

不可能以声明方式应用泛型参数筛选。对于方面目标的高级筛选,您可以覆盖方面上的方法并以编程方式进行筛选

然而,在您描述的情况下,即使这样也不够。假设您已将方面应用于
MyClass
中的一个方法。在编译的这一点上,T还不知道,所以不可能执行检查。当在代码中的其他地方声明
MyClass
的字段或变量时,具体的T是已知的

在您的案例中,我看到的最佳选择是为目标类的每个实例生成方面并在运行时进行验证。您可以在下面找到此方法的示例实现

[PSerializable]
public class LogMethodAttribute : OnMethodBoundaryAspect, IInstanceScopedAspect
{
    private bool disabled;

    public override void OnEntry( MethodExecutionArgs args )
    {
        if ( !this.disabled )
        {
            Console.WriteLine( "OnEntry: {0}({1})", args.Method.Name, args.Arguments.GetArgument( 0 ) );
        }
    }

    public object CreateInstance( AdviceArgs adviceArgs )
    {
        LogMethodAttribute clone = (LogMethodAttribute) this.MemberwiseClone();

        Type type = adviceArgs.Instance.GetType();
        if ( type.IsGenericType )
        {
            Type[] genericArguments = type.GetGenericArguments();
            // Filter out targets where T is string.
            if ( genericArguments[0] == typeof( string ) )
            {
                clone.disabled = true;
            }
        }

        return clone;
    }

    public void RuntimeInitializeInstance()
    {
    }
}

class Program
{
    static void Main( string[] args )
    {
        var obj1 = new Class1<int>();
        obj1.Method1(1);

        var obj2 = new Class1<string>();
        obj2.Method1("a");
    }
}

[LogMethod(AttributeTargetElements = MulticastTargets.Method)]
public class Class1<T>
{
    public void Method1(T a)
    {
    }
}
[可序列化]
公共类LogMethodAttribute:OnMethodBoundaryAspect,IInstanceScopedAspect
{
私人楼宇残疾人士;
public override void OnEntry(MethodExecutionArgs args)
{
如果(!this.disabled)
{
WriteLine(“OnEntry:{0}({1})”,args.Method.Name,args.Arguments.GetArgument(0));
}
}
公共对象CreateInstance(AdviceArgs AdviceArgs)
{
LogMethodAttribute克隆=(LogMethodAttribute)this.MemberwiseClone();
Type Type=adviceArgs.Instance.GetType();
if(type.IsGenericType)
{
Type[]genericalarguments=Type.getgenericalarguments();
//筛选出T为字符串的目标。
if(一般参数[0]==typeof(字符串))
{
clone.disabled=true;
}
}
返回克隆;
}
public void RuntimeInitializeInstance()
{
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var obj1=新类别1();
方法1(1);
var obj2=new Class1();
obj2.方法1(“a”);
}
}
[LogMethod(AttributeTargetElements=MulticastTargets.Method)]
公共班级1
{
公共无效方法1(TA)
{
}
}
[PSerializable]
public class LogMethodAttribute : OnMethodBoundaryAspect, IInstanceScopedAspect
{
    private bool disabled;

    public override void OnEntry( MethodExecutionArgs args )
    {
        if ( !this.disabled )
        {
            Console.WriteLine( "OnEntry: {0}({1})", args.Method.Name, args.Arguments.GetArgument( 0 ) );
        }
    }

    public object CreateInstance( AdviceArgs adviceArgs )
    {
        LogMethodAttribute clone = (LogMethodAttribute) this.MemberwiseClone();

        Type type = adviceArgs.Instance.GetType();
        if ( type.IsGenericType )
        {
            Type[] genericArguments = type.GetGenericArguments();
            // Filter out targets where T is string.
            if ( genericArguments[0] == typeof( string ) )
            {
                clone.disabled = true;
            }
        }

        return clone;
    }

    public void RuntimeInitializeInstance()
    {
    }
}

class Program
{
    static void Main( string[] args )
    {
        var obj1 = new Class1<int>();
        obj1.Method1(1);

        var obj2 = new Class1<string>();
        obj2.Method1("a");
    }
}

[LogMethod(AttributeTargetElements = MulticastTargets.Method)]
public class Class1<T>
{
    public void Method1(T a)
    {
    }
}