PDA

View Full Version : استفاده از داده فرستاده شده به متد در Attribute آن متد



emad4000
شنبه 29 آذر 1393, 12:54 عصر
سلام
من یک تابع دارم که از یک Attribute استفاده می کنه
این Attribute سه تا ورودی داره

[System.AttributeUsage(System.AttributeTargets.Meth od)]
public class CheckXAttribute : Attribute
{
public CheckXAttribute(int data1, bool data2, byte[] data3)
{
SomeWork(data1, data2, data3);
}
}


دو تا متغیر اولی که به Attribute وارد میشن در زمان کدنویسی مشخص هستند و اصطلاحاً Hard Code میشن
ولی داده سوم در زمان اجرا بدست میاد. آیا راهی هست که این Attribute از داده فرستاده شده به متد استفاده کنه؟
یه چیزی تو این مایه ها ...

[CheckX(5, true, data3)]
myMethod(byte[] data3){
// Some Work
}

...

byte[] data = ...;
myMethod(data);



یا اینکه داده رو قبلش به کلاس حاوی متد بفرستم و بعد Attribute بگیرتش و استفاده کنه؟
اصلاً همچین کاری درست هست یا Attribute ها فقط برای داده های معین کار می کنن؟؟؟؟

plus
شنبه 29 آذر 1393, 14:01 عصر
بعید میدونم راه مستقیمی وجود داشته باشه ولی شما میتونید توی خود متد، Attribute مربوطه رو بدست بیارین (طبیعتا با Reflection) و داده ها رو به متدی که برای Attribute نوشتین بفرستین.چیزی شبیه به این :

[System.AttributeUsage(System.AttributeTargets.Meth od)]
public class CheckXAttribute : Attribute
{
private int data1;
private bool data2;
public CheckXAttribute(int data1, bool data2)
{
this.data1 = data1;
this.data2 = data2;
}
public void SetData3AndDoWork(byte[] data3)
{
SomeWork(this.data1, this.data2, data3);
}
}

...

[CheckX(5, true)]
myMethod(byte[] data3){
CheckXAttribute checkAttribute = ... ; // Get CheckX attribute of current method using reflection.
checkAttribute.SetData3AndDoWork(data3);
}

هرچند به نظرم این استفاده از Attribute صحیح نیست و دارین مسیر نادرست رو میرین.Attribute محل نگه داری MetaData هست نه اجرای کد.شاید بهتر باشه که قسمت DoWork رو در خارج از Attribute قرار بدین و در متد به صورت دستی (با گرفتن دو بخش اول اطلاعات از Attribute و بخش سوم از آرگومان) فراخوانیش کنید.

emad4000
شنبه 29 آذر 1393, 14:09 عصر
هرچند به نظرم این استفاده از Attribute صحیح نیست و دارین مسیر نادرست رو میرین.Attribute محل نگه داری MetaData هست نه اجرای کد.

حرف شما درسته. من نباید از Attribute به عنوان محل اجرای کد استفاده کنم. اگر بخوام این روش های پیچیده رو برم، مستقیماً اون کد اجرایی رو در ابتدای تابع می نوشتم و درگیر Attribute نمی شدم.
من می خواستم در ابتدای هر تابعم کار خاصی اجرا بشه، ولی به جای فراخوانی تابع، از کد زیباتری مثل Attribute استفاده کنم، ولی نشد.
به هر حال ممنون