1

使用 Linq DataContext 从数据库获取数据列表时遇到问题

我正在尝试以下代码

公共类 DBContextNew:数据上下文 {

    public static string StoreProcedureName = "";

    [Function(Name = StoreProcedureName, IsComposable = false)]
    public ISingleResult<T> getCustomerAll()
    {

        IExecuteResult objResult =
          this.ExecuteMethodCall(this, (MethodInfo)(MethodInfo.GetCurrentMethod()));

        ISingleResult<T> objresults =
            (ISingleResult<T>)objResult.ReturnValue;
        return objresults;
    }


}

但我得到了错误

[函数(名称 = StoreProcedureName,IsComposable = 假)]

as 属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式

我想在运行时将值传递给 Name 属性。

可能吗?

请帮忙。

4

3 回答 3

0

在简单属性上使用城堡动态代理。因为用属性来做这件事会迫使你在运行时使用反射来改变属性参数中的一些东西。这样,就像建议的那样,user1908061会导致两个问题:

1) 性能问题。在运行时调用存储过程对于应用程序的性能来说非常“重量级” 2)多线程问题。假设有 2 个线程以 10 个滴答的间隔调用此代码

var method = typeof(TestClass).GetMethod("Foo");
var attribute = method.GetCustomAttribute(typeof(TestAttribute)) as TestAttribute;
attribute.Bar = "Hello";

Thread1 会将 param 的属性更改Bar为“Hello”,此时 Thread2 将访问相同的代码并将Barparam 更改为其他值,这将导致问题。让我们在时间轴上看看它:

 0 ticks - Thread1 started to work, accessed the property of TestAttribute and made the Bar param = "Hello"
 20 ticks - Thread2 started to work, accessed the property of TestAttribute and made the Bar param = "SomeOtherValue"
 40 ticks - You are expecting that you will call function with `Bar`=="Hello", but it's getting called with the `Bar`=="SomeOtherValue"
 60 ticks - Thread2 getting called with `Bar`=="SomeOtherValue"

所以你的 Thread1 会得到错误的结果。

所以我建议使用 CastleDynamicProxy 来做你想做的事。有了它,您可以在方法之前运行一些代码并替换方法的结果,也可以在方法之后运行一些代码。这种方式将在运行时工作。

还有一种技术——PostSharp 会做同样的事情,但会以另一种方式。这将在编译时工作。

于 2013-07-04T10:51:35.923 回答
0

问题是:

 public static string StoreProcedureName = "";

你需要让它成为一个常数。

public const string StoreProcedureName = "";

编译器会在错误消息中告诉您这一点(它必须是一个常量表达式)。

于 2013-07-04T09:25:51.777 回答
0

不幸的是,您不能为属性声明提供动态值(如变量的内容)。

但是,您可以在运行时更改属性的值:

public class TestAttribute : Attribute
{ public string Bar { get; set; } }

public class TestClass
{
    [Test]
    public string Foo()
    { return string.Empty; }
}

然后改变这个值:

var method = typeof(TestClass).GetMethod("Foo");
var attribute = method.GetCustomAttribute(typeof(TestAttribute)) as TestAttribute;
attribute.Bar = "Hello";

请记住,属性在您的类的所有实例之间共享。

于 2013-07-04T10:05:31.907 回答