2013-07-04 76 views
1

我同時獲得使用LINQ的DataContext動態設定值功能屬性的C#中的參數

我想下面的代碼

公共類DBContextNew從數據庫數據列表面臨的問題:DataContext的 {

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 =假)]作爲屬性參數

必須是常量表達式,屬性參數類型

我的typeof運算 表達或數組創建表達式想在運行時將值傳遞給Name屬性。

可能嗎?

請幫忙。

+1

這是不可能的,屬性參數無法在運行時傳遞 – wudzik

+1

儘管深度反射是可能的。但是你必須知道,運行時反射會導致性能問題,所以你必須盡一切努力才能生存下來。當你在項目啓動或某個單身官員工作上做某事時,反思是很好的。 – Maris

+0

忘記將動態數據傳遞給屬性,告訴我們您將嘗試存檔的內容,並且我們將嘗試幫助您解決問題,而無需使用屬性。 – Maris

回答

0

的問題是:

public static string StoreProcedureName = ""; 

你需要使它成爲一個常數。

public const string StoreProcedureName = ""; 

編譯器在錯誤消息中告訴你(它必須是一個常量表達式)。

+0

謝謝,但我想在運行時爲StoreProcedureName賦值,所以它不適用於我。 –

+1

@NileshNikumbh - 我不認爲你可以在運行時傳遞它們。我遇到過類似的問題, –

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"; 

請記住,屬性在您的類的所有實例共享。

+0

您必須重新解釋這會導致多線程問題。 – Maris

0

使用城堡動態代理而不是簡單屬性。因爲使用屬性來強制執行它會強制您在運行時使用反射來更改屬性參數中的某些內容。這樣,就像user1908061一樣會引起2個問題:

1)性能問題。在運行時調用存儲過程對於應用程序的性能非常「重量級」。2)多線程問題。讓我們想象一下,2個線程調用此碼爲10,間隔蜱

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

線程1將改變Bar參數的時屬性爲「Hello」在這一次的線程2將訪問相同的代碼,並且將改變Bar參數去一些其他的價值,這將導致問題。讓我們在時間軸上看看它:

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將以相同的方式執行相同操作,但有一點會以另一種方式進行。這個將在編譯時工作。

+0

顯然你可以在屬性設置器中添加一個鎖來避免線程問題。 – user1908061

+0

Yeap。這將解決部分問題。但讓我們假設你有1000000個線程正在運行並試圖訪問這個方法,但他們不能這樣做,因爲'Bar'被鎖定了。這會帶來更多問題。這個過程將變得更加難以控制。 – Maris