سؤال

بالنظر إلى الشرط:

خذ رسم بياني كائن ، قم بتعيين جميع خصائص نوع التعداد بناءً على معالجة قيمة خاصية السلسلة الثانية. تملي الاتفاقية أن اسم خاصية سلسلة المصدر سيكون اسم خاصية ENUM مع postfix من "RAW".

من خلال المعالجة ، نعني أننا سنحتاج إلى تجريد الأحرف المحددة وما إلى ذلك

لقد نظرت إلى التنسيقات المخصصة ، وحفلات القيمة ومحولات الكتابة ، لا شيء يبدو وكأنه حل لهذا؟

نريد استخدام السيارات بدلاً من روتين الانعكاس الخاص بنا لسببين ، أ) يتم استخدامه على نطاق واسع خلال بقية المشروع و B) يمنحك OOTB العودية.

-- مثال --

بالنظر إلى الهيكل (البسيط) أدناه ، وهذا:

var tmp = new SimpleClass 
  { 
       CountryRaw = "United States",
       Person = new Person { GenderRaw="Male" }
  };

var tmp2 = new SimpleClass();

Mapper.Map(tmp, tmp2);

كنا نتوقع أن يكون التعداد MapPedCountry من TMP2 بلد.

public class SimpleClass1
{
  public string CountryRaw {get;set;}

  public Country MappedCountry {get;set;}

  public Person Person {get;set;}
}

public class Person
{
  public string GenderRaw {get;set;}

  public Gender Gender {get;set;}

  public string Surname {get;set;}
}

public enum Country
{
  UnitedStates = 1,
  NewZealand = 2
}

public enum Gender
{
  Male,
  Female,
  Unknown
}

شكرًا

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

المحلول

لقد فعلت ذلك مع القيمة، هنا كل شيء:

لقد أضفت دعامة أخرى إلى SimpleClass فقط لأوضح لك كيف تعمل

public class SixFootUnderTest
{
    [Test]
    public void Test()
    {
        var o = new SimpleClass1
                    {
                        CountryRaw = "United States",
                        GenderRaw = "Female",
                        Person = new Person { GenderRaw = "Male" }
                    };

        var oo = new SimpleClass1();

        oo.InjectFrom(o)
            .InjectFrom<StrRawToEnum>(o);
        oo.Person.InjectFrom<StrRawToEnum>(o.Person);

        oo.Country.IsEqualTo(Country.UnitedStates);
        oo.Gender.IsEqualTo(Gender.Female);
        oo.Person.Gender.IsEqualTo(Gender.Male);
    }

    public class SimpleClass1
    {
        public string CountryRaw { get; set; }

        public Country Country { get; set; }

        public string GenderRaw { get; set; }

        public Gender Gender { get; set; }

        public Person Person { get; set; }
    }

    public class Person
    {
        public string GenderRaw { get; set; }

        public Gender Gender { get; set; }

        public string Surname { get; set; }
    }


    public class StrRawToEnum : LoopValueInjection
    {
        protected override bool UseSourceProp(string sourcePropName)
        {
            return sourcePropName.EndsWith("Raw");
        }

        protected override string TargetPropName(string sourcePropName)
        {
            return sourcePropName.RemoveSuffix("Raw");
        }

        protected override bool TypesMatch(Type sourceType, Type targetType)
        {
            return sourceType == typeof(string) && targetType.IsEnum;
        }

        protected override object SetValue(object sourcePropertyValue)
        {
            return Enum.Parse(TargetPropType, sourcePropertyValue.ToString().Replace(" ", ""), true);
        }
    }

    public enum Country
    {
        UnitedStates = 1,
        NewZealand = 2
    }


    public enum Gender
    {
        Male,
        Female,
        Unknown
    }
}

أيضًا في حال احتجت إلى القيام بذلك من CountryRaw إلى MedcedCountry ، يمكنك القيام بذلك على هذا النحو:

oo.InjectFrom(new StrRawToEnum().TargetPrefix("Mapped"), o);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top