هل هناك ما يعادل tostringbuilder جافا ل C #؟ ما هي ميزة إصدار C # جيدة؟

StackOverflow https://stackoverflow.com/questions/2417647

سؤال

في عالم Java لدينا مشاعات Apache tostringbuilder. للمساعدة في إنشاء تطبيقات Tostring ().

هل يعرف أحد بتنفيذ مجاني لائق ل C #؟ هل هناك بدائل أفضل لا أعرفها؟

إذا لم يكن هناك تطبيق مجاني موجود مما أعتقد أن هذا السؤال يصبح أكثر من مسألة "ما الذي سيجعل tostringbuilder جيدة في C # 3؟"

خارج الجزء العلوي من رأسي:

  • يمكن أن تقدم كلا من الانعكاس وخلق سلسلة Tostring اليدوية.

  • سيكون رائعا حقا إذا كان يمكن استخدام أشجار التعبير.

شيء من هذا القبيل..

 public override string ToString()
   {
      return new ToStringBuilder<Foo>(this)
         .Append(t => t.Id)
         .Append(t => t.Name)
         .ToString();
   }

الذي سيعود:

 "Foo{Id: 1, Name: AName}"
  • يمكن أن تستخدم System.Election.emit إلى Precompile مندوب Tostring.

أي أفكار أخرى؟

تحديث

فقط لتوضيح Tostringbuilder هو مخلوق مختلف ل Stransbuilder .. أبحث عن شيء أقرب إلى وظائف Tostringbuilder APACHE COMMON's Tostringbuilder، ويحتوي على ميزات مثل التنسيق متعدد السطر، وأنماط مختلفة وخلق قاعدة التأمل. شكرًا.

تحديث 2.

لقد بنيت بلدي. يرى هنا.

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

المحلول

تعديل: حسنا، تريد استخدام الانعكاس حتى لا تضطر إلى كتابة أسماء الممتلكات. أعتقد أن هذا سيحصل عليك ما أنت بعد:

// forgive the mangled code; I hate horizontal scrolling
public sealed class ToStringBuilder<T> {
    private T _obj;
    private Type _objType;
    private StringBuilder _innerSb;

    public ToStringBuilder(T obj) {
        _obj = obj;
        _objType = obj.GetType();
        _innerSb = new StringBuilder();
    }

    public ToStringBuilder<T> Append<TProperty>
    (Expression<Func<T, TProperty>> expression) {

        string propertyName;
        if (!TryGetPropertyName(expression, out propertyName))
            throw new ArgumentException(
                "Expression must be a simple property expression."
            );

        Func<T, TProperty> func = expression.Compile();

        if (_innerSb.Length < 1)
            _innerSb.Append(
                propertyName + ": " + func(_obj).ToString()
            );
        else
            _innerSb.Append(
                ", " + propertyName + ": " + func(_obj).ToString()
            );

        return this;
    }

    private static bool TryGetPropertyName<TProperty>
    (Expression<Func<T, TProperty>> expression, out string propertyName) {

        propertyName = default(string);

        var propertyExpression = expression.Body as MemberExpression;
        if (propertyExpression == null)
            return false;

        propertyName = propertyExpression.Member.Name;
        return true;
    }

    public override string ToString() {
        return _objType.Name + "{" + _innerSb.ToString() + "}";
    }
}

مثال:

// from within some class with an Id and Name property
public override string ToString() {
    return new ToStringBuilder<SomeClass>(this)
        .Append(x => x.Id)
        .Append(x => x.Name)
        .ToString();
}

ها، السلوك الذي أنت بعد:

class Thing {
    public int Id { get; set; }
    public string Name { get; set; }

    public override string ToString() {
        return new ToStringBuilder<Thing>(this)
            .Append(t => t.Id)
            .Append(t => t.Name)
            .ToString()
    }
}

void Main() {
    var t = new Thing { Id = 10, Name = "Bob" };
    Console.WriteLine(t.ToString());
}

انتاج:

شيء {ID: 10، الاسم: "BOB"}

نصائح أخرى

السؤال الأصلي المعني C # 3.5 ولكن منذ ذلك الحين تمت ترقيته إلى C # 4.

اعتقدت أنني سأشارك إصداري الجديد هنا في حالة فائدة الآخرين. يحتوي على كل الميزات المذكورة في هذا الموضوع وتجميعها في وقت التشغيل بطريقة خطية سريعة.

أحضره هنا: tostringbuilder.

قد لا يكون بالضبط ما أنت بعد ذلك لأنه غير مجاني، ولكن إعادة عرض سوف تفعل هذا. إنه مكون إضافي رائع لاستوديو Visuals الذي يفعل الكثير أكثر من توليد ToString. ولكن سوف تفعل ذلك ل. ضع مؤشرك داخل صفك، وضرب ALT + INSERT واختر موشم الأعضاء.

استخدام .NET .NET stringbuilder..

لاحظ أنه يجب عليك توفير قالب صغير بنفسك.

على سبيل المثال:

public StringBuilder ToStringBuilder<T>(T type) where T : IYourInterface
{
StringBuilder sb = new StringBuilder();
sb.append(type.key);
// more appends

return sb;
}

قدمت كيندا generic الطريقة هنا. ستكون قادرا على إنشاء محلول أنيق الخاص بك مع System.Reflection مساحة الاسم في .NET.

هتافات

شاهد هذا المشروع ...

http://commonsdotnet.codeplex.com/

underprinter. سوف تفعل هذا لك مع عدد من الميزات القابلة للتخصيص. لا تزال الوثائق صعبة بعض الشيء، لكننا نستخدمها في الإنتاج لسنوات مع نتائج رائعة.

أعتقد أنك أنت على شيء باستخدام تعبيرات. قرأت هذه المادة فقط في الليلة الأخرى: الحصول على معلومات حول الكائنات والأنواع والأعضاء مع أشجار التعبير

أراهن أنه يمكنك الجمع بين تلك التقنيات مع التعليمات البرمجية التي تم نشرها على هذا الموضوع للحصول على ما أنت عليه.

لا أعرف من أي مشاريع حالية من شأنها أن تفعل ما تريد، ولكن لن يكون من الصعب تنفيذ المثال الذي قدمته باستخدام Lambdas.

فيما يلي فكرة أخرى [غير مجهول / غير من غير المنصوص عليها / ربما خلل] باستخدام مندوبين مجهولين:

public override string ToString() {
    return this.ToString(x => {
        x.Append(t => t.Id);
        x.Append(t => t.Name);
    });
}

هذه ToString() سيتم كتابة الحمولة الزائدة كطريقة تمديد، لذلك تحصل على مرجع إلى الكائن المصدر، وستقبق Action<T> حيث [T] هو نوع الكائن المصدر. ستقوم طريقة ToString () بعد ذلك بزيادة منشئ سلسلة أو كائن داخلي من نوع ما، قم بتنفيذ الطريقة المجهولة التي تم تمريرها من المتصل، ثم لف النتيجة في أي نص فتح / إغلاق ضروري.

لتكون واضحة، ليس لدي في الواقع حاول هذه. أعتقد فقط أنها أكثر مرونة قليلا من مثال لامدا بناء على السؤال الأصلي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top