1

このPeopleクラスを考えてみましょう:

public class People
{
    public virtual string Name { get; set; }    
    public virtual ushort Age { get; set; }
}

人のデータを取得できるサードパーティの実装がいくつかありますが、少しバリエーションがあります。たとえば、次のデータを取得できるメソッドがありますStrangePeople

    public class StrangePeople
    {
        public string Name { get; set; }        
        public DateTime BirthDate { get; set; }
    }
    ...
    StrangePeople someone = GetData<StrangePeople>();

Peopleクラスとバリエーションの量が多いため、後でキャストできるように、データを変換できるランタイム サブクラスを生成する方法を見つけようとしましたPeople。つまり、最小限の労力で、次のようなサブクラスを生成します。

public class StrangePeopleTranslator : People
{
    private ushort? _mAge = null;

    public override ushort Age
    {
        get
        {
            if (_mAge == null)
            {
                DateTime today = DateTime.Today;
                int age = today.Year - BirthDate.Year;
                if (BirthDate > today.AddYears(-age)) age--;
                _mAge = age;
            }

            return _mAge.GetValueOrDefault();
        }
        set
        {
            _mAge = value;
        }
    }

    public DateTime BirthDate { get; set; }
}

...

People someoneElse = (People)GetData<StrangePeopleTranslator>();

多分ランタイムサブクラスは少しやり過ぎです...わかりません。

4

2 に答える 2

2

できる最善のことは、暗黙的なキャスト オーバーロードを提供することです。そうすれば、次のように からStrangePeopleに変換できます。People

public class StrangePeople
{
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }

    public static implicit operator People(StrangePeople strangePerson)
    {
        DateTime today = DateTime.Today;
        int age = today.Year - strangePerson.BirthDate.Year;
        if (strangePerson.BirthDate > today.AddYears(-age))
        {
            age--;
        }

        return new People
                    {
                        Name = strangePerson.Name,
                        Age = (ushort) age
                    };
    }

次に、これを行うことができます:

People someoneElse = GetData<StrangePeopleTranslator>();

キャストも必要ありません。

于 2013-05-01T02:58:53.880 に答える
1

これにどれだけの労力を費やすかにもよりますが、動的に生成された を使用して単一のサブクラスを使用できFuncますSystem.Linq.Expressions.

基本的な考え方:

public class Subclass : People
{
    public Func<DateTime, ushort> BirthDateToAge;
    ushort _mAge;

    public override ushort Age
    {
        get { return AgeImpl(_mAge); }
        set { _mAge = value; }
    }
}

// And then somewhere else where you'd want to create the "subclass"
var people = new Subclass();
Func<DateTime, ushort> setter = (Func<DateTime, ushort>)(bday => (ushort)CalcElapsedYears(bday));
people.AgeImpl = setter;

おそらく別の因数分解が必要になるでしょうが、基本的な概念は同じです。 s を介して完全に操作できる汎用サブクラスを作成し、リフレクションなどを行うときにFunc<>それらの s を構築します。Func<>

頭が悪いですが、うまくいくはずです。

于 2013-05-01T05:04:18.580 に答える