سؤال

وأنا جديدة على C # (بدأت الاسبوع الماضي) حتى يكون باردا معي؛). أود أن أعرف ما إذا كنت يمكن بطريقة أو بأخرى إرسال خاصية مخصصة، اسمحوا لي أن أشرح:

ولدي بعض فئات جزئية أن أكمل بإضافة خصائص، ولكن نمط من كل حاصل على واضعي هي نفسها لذلك أود أن حلل إلى عوامل هذا:

public partial class Travel
{
    public String TravelName
    {
        get
        {
            return LocaleHelper.GetRessource(Ressource1);
        }
        set
        {
            if (this.Ressource1 == null)
                Ressource1 = new Ressource() { DefaultValue = value };
            else
                Ressource1.DefaultValue = value;
        }
    }

    public String TravelDescription
    {
        get
        {
            return LocaleHelper.GetRessource(Ressource2);
        }
        set
        {
            if (this.Ressource2 == null)
                Ressource2 = new Ressource() { DefaultValue = value };
            else
                Ressource2.DefaultValue = value;
        }
    }
}

وكما ترون، والشيء الوحيد الذي تغير هو Ressource1 / Ressource2. هدفي هو أن يكون قادرا على كتابة شيء من هذا القبيل:

public partial class Travel
{
    public LocalizedString TravelName(Ressource1);

    public LocalizedString TravelDescription(Ressource2);
}

وأي شخص لديك فكرة لجعل هذا، أو فكرة أخرى لجعل بلدي نظافة مدونة؟ شكرا لك،

وغيوم

هل كانت مفيدة؟

المحلول

وليس هناك تسهيلات للقيام بذلك داخل C # .NET أو في حد ذاته، ولكن إذا كنت تفعل الكثير من هذه فانه قد يكون من المفيد التحقيق الجانب الموجه البرمجة من خلال <لأ href = "http://www.postsharp.org/" يختلط = "نوفولو noreferrer"> postsharp . اساسا انها تسمح لك لتحديد سمة الذي يسبب رمز إضافية ليتم حقنه في وقت الترجمة. رمز تكتبه يكون شيئا مثل:

public partial class Travel
{
    [LocalizedProperty(source = "Ressource1")
    public string TravelName { get; set; }

    [LocalizedProperty(source = "Ressource2")
    public string TravelDescription{ get; set; }
}

وفي وقت الترجمة PostSharp سيحل محل العقار مع قالب عرفتها في فئة LocalizedPropertyAttribute جديدة.

نصائح أخرى

وأنت لا يمكن أن تجعل من تماما كما مقتضبة عن ما تصفون، ولكن هل يمكن أن تقلل من التعقيد والتكرار من واضعي.

private void SetRessource(ref Ressource res, string value)
{
    if(res == null) res = new Ressource();

    res.DefaultValue = value;
}

public String TravelName
{
    get { return LocaleHelper.GetRessource(Ressource1); }
    set { SetRessource(ref this.Ressource1, value); }
}

public String TravelDescription
{
    get { return LocaleHelper.GetRessource(Ressource2); }
    set { SetRessource(ref this.Ressource2, value); }
}

وأنا لا أعرف بالضبط ما تحاول تحقيقه، ولكن هل يمكن جعل الامور معقدة للغاية. لن يكون هذا كافيا؟

public class Travel
{
   /// <summary>
   /// Creates a new instance of <see cref="Travel"/>.
   /// </summary>
   public Travel()
   {
      this.TravelName = Resources.DefaultTravelName;
      this.TravelDescription = Resources.DefaultTravelDescription;
   }

   public string TravelName { get; set; }

   public string TravelDescription { get; set; }
}

وحيث الموارد هو الفئة التي تم إنشاؤها (من ملف RESX) للموارد المحلية. لقد شعور تحاول بناء إطار توطين الخاصة بك لأنك لا نعرف حتى الآن أن صافي <لأ href = "http://msdn.microsoft.com/en-us/library/3xbc3357٪28VS.71٪ 29.aspx "يختلط =" نوفولو noreferrer "> بالفعل البنية الأساسية لهذا .

لا، ليس هناك مثل هذه الطريقة. وسيكون من الممكن في بي ولكن ليس في C #.

ويجب تغيير نهجكم بعيدا عن الخصائص في هذه القضية.

وUPD: ربما يمكنك استخدام شيء مثل هذا لكل الممتلكات (باستثناء لانها ضعف واضح):

public class Prop
{
    Resource _res;

    public Prop(Resource res)
    {
        this._res = res;
    }

    public string Value
    {
        get
        {
            return LocaleHelper.GetRessource(_res);
        }
        set
        {
            if(_res == null)
                // This is a weak point as it's now
                // as it wont work
            else
                _res.DefaultValue = value;
        }
}

هل يمكن تطبيق خاصية فهرستها واحد، مما يتيح لك أحد الخيارات تركيب اثنين التالية استنادا إلى تفضيلاتك. سيكون رمز يكون أساسا وظيفة يقبل الموارد سمى تحديدا وإرجاع المحتوى الصحيح.

Travel t = new Travel();
string x = t["Name"];
    or 
string x = t[Travel.Name];

هل يمكن أن تجعل حياتك أسهل عن طريق التغليف جالبة والمنطق واضعة في الفئة الأساسية ومن ثم الدعوة ببساطة تلك الأساليب من أي خصائص جديدة تقوم بإنشائها (العمل ببساطة المجمع كما رقيقة حول تلك الأساليب). وإليك مثال:

public class Travel : LocalizedRessourceSubscriber
{

    private Ressource<string> Ressource1 = null;
    private Ressource<string> Ressource2 = null;

    public String TravelName { 
        get { return GetRessource<string>(Ressource2); }
        set { SetRessource<string>(Ressource1, value); } 
    }

    public String TravelDescription {
        get { return GetRessource<string>(Ressource2); }
        set { SetRessource<string>(Ressource2, value); } 
    }

}

public class LocalizedRessourceSubscriber
{

    protected T GetRessource<T>(Ressource<T> Source)
    {
        return LocaleHelper.GetRessource<T>(Source);
    }

    protected void SetRessource<T>(Ressource<T> Source, T Value)
    {
       (Source ?? 
           (Source = new Ressource<T>())
                ).DefaultValue = Value;
    }

}

... وبهذه الطريقة، هناك منطق القليل جدا في الممتلكات الخاصة بك وأنت تكرار أقل رمز. هذا يفترض الفئات التالية (التي سخر genericized عليه السلام):

public static class LocaleHelper
{
    public static T GetRessource<T>(Ressource<T> Source)
    {
        return default(T);
    }
}

public class Ressource<T>
{
    public T DefaultValue { get; set; }
}

وهذا لا معنى له. باستخدام بروبرتس الطريقة التي يكون لهم حاليا، يمكنك ببساطة كتابة:

   Travel t = new Travel();
   string tvlName = t.TravelName;    
   string desc = t.TravelDescription;

إذا قمت بتغيير لبالطريقة التي تريدها عليك أن تحدد المعلمة فضلا

   Travel t = new Travel();
   LocalizedString tvlName = t.TravelName([someresopurcedesignator]);    
   LocalizedString desc = t.TravelDescription([someresopurcedesignator]);  

وكل ما يمكن القيام به هو جعل "propertyBag" محاكي

   public class Travel 
   {
       private LocalizedString props = new LocalizedString();
       public LocalizedString Propertys
       {
          get { return props; }
          set { props = value; }
       }

   }

   public class LocalizedString // this is property Bag emulator
   {
       public string this[string resourceName]
       {
           get{ return LocaleHelper.GetRessource(resourceName); }
           set{ LocaleHelper.GetRessource(resourceName) = value; }
       }
   }

هل الوصول إلى هذا مثل هذا:

   Travel t = new Travel();
   t.Propertys[NameResource1] = "Bob Smith";
   t.Propertys[DescriptionResource2] = "Fun trip to discover the orient";
   string tvlName = t.Propertys[NameResource1];    
   string desc    = t.Propertys[DescriptionResource2];    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top