C# 通过派生类中的.NET反射调用受保护的泛型方法

C# 通过派生类中的.NET反射调用受保护的泛型方法,c#,silverlight,generics,windows-phone-7,code-access-security,C#,Silverlight,Generics,Windows Phone 7,Code Access Security,最近我尝试在WP7应用程序中执行类似的操作 我有课 abstract class A { //this method has an implementation protected void DoSomething<T, TKey>(Func<T, TKey> func) { //impl here } }; 我得到了一个例外。我知道这是一个安全异常,但我可以从那个地方正常调用该方法,所以我也应该能够通过反射调用它 可能有什么问题?谢谢 来自 在某些情况下会引发此异常

最近我尝试在WP7应用程序中执行类似的操作

我有课

abstract class A {
//this method has an implementation
protected void DoSomething<T, TKey>(Func<T, TKey> func) { //impl here }
};
我得到了一个例外。我知道这是一个安全异常,但我可以从那个地方正常调用该方法,所以我也应该能够通过反射调用它

可能有什么问题?谢谢

来自

在某些情况下会引发此异常 例如:

  • 私人的、受保护的或内部的 无法访问的方法 从普通的编译代码中访问 通过使用 反思

  • 访问安全关键方法 来自透明代码

  • 数据库中方法的访问级别 类库已更改,一个或多个 更多引用 库尚未重新编译


在WP7中,我认为最有可能的问题是,此反射代码试图访问私有(非公共)方法,而WP7已经非常清楚,它被锁定以防止这种类型的访问。

为什么要通过反射来执行此操作,而不仅仅是编译调用?说真的,为什么要通过反射来执行此操作,当它增加的只是一堆开销时?嗨,谢谢你的评论,这段代码与Sterling DB有关。我想拥有指示Sterling表(类级别)和表键(属性级别)的属性。然后我想收集所有具有此属性的类,并通过Sterling API将它们注册为表。我使用反射的原因是,用于注册的CreateTableDefinition的泛型方法参数类型未知,可以是任何类型。此外,还有一个lambda,表示哪个属性是键。在本例中,CreateTableDefinition在类A中。谢谢,问题是,当硬编码和编译时,该方法是可访问的。我正在考虑编译我正在使用的库(Sterling DB)和assembly:AllowPartiallyTrustedCaller我认为反射程序集中的方法不可信-因此没有办法解决这个问题。如果没有意义-我认为这里的问题是无法访问反射的方法,但实际上是对这一点反射机制的访问-WP7被锁定,以防止您在例如未记录的APIs上使用它返回到此,尝试将源代码作为另一个项目添加到解决方案中,但没有成功。看来这是不可能的。谢谢。LOL-我目前正在尝试编写相同类型的代码。。。我遇到了同样的例外。。。我在寻找答案。。。我找到了自己的答案。。。啊:)
    public class B : A {
      void SomeMethod(Type tableType, PropertyInfo keyProperty){ 
        MethodInfo mi = this.GetType()
                .GetMethod("DoSomething", BindingFlags.Instance | BindingFlags.NonPublic)
                .MakeGenericMethod(new Type[] { tableType, keyProperty.GetType() });

            LambdaExpression lambda = BuildFuncExpression(tableType, keyProperty);
// MethodAccessException
            mi.Invoke(this, new object[] { lambda });
        }

        private System.Linq.Expressions.LambdaExpression BuildFuncExpression(Type paramType, PropertyInfo keyProperty)
        {
            ParameterExpression parameter = System.Linq.Expressions.Expression.Parameter(paramType, "x");
            MemberExpression member = System.Linq.Expressions.Expression.Property(parameter, keyProperty);
            return System.Linq.Expressions.Expression.Lambda(member, parameter);
        }


}
    };