C#为类的属性定义(多个)可能的类型

C#为类的属性定义(多个)可能的类型,c#,entity-framework,class,oop,properties,C#,Entity Framework,Class,Oop,Properties,我想我在这里遇到了一个基本的OOP误解: (顺便说一句,这些是实体框架6类,以防您对“虚拟”感到惊讶) 但这不是最好的解决方案,对吗? 我想确定受害者可以是一支部队或人群 我还考虑过通过setter实现这一点: public ICollection<object> Victims { get; set { if (value.GetType() == typeof(Troop) || value.GetType() == typeof(Popula

我想我在这里遇到了一个基本的OOP误解:

(顺便说一句,这些是实体框架6类,以防您对“虚拟”感到惊讶)

但这不是最好的解决方案,对吗? 我想确定受害者可以是一支部队或人群

我还考虑过通过setter实现这一点:

public ICollection<object> Victims { get; 
    set 
    {
        if (value.GetType() == typeof(Troop) || value.GetType() == typeof(Population))
            Victims.Add(value);
    }
}
公共ICollection受害者{get;
设置
{
if(value.GetType()==typeof(force)| | value.GetType()==typeof(Population))
增加(价值);
}
}
但我仍然不认为这是最好的方法,或者可能是。。。
有更好、更干净的吗?

您可以使用接口

public class WeaponUsed : HistoryEvent
{
    public virtual Player Target { get; set; }
    public virtual GameCountry Country { get; set; }
    //Victims: Troops or Pops
    public IVictim Victims { get; set; }
    public bool HasMoreWeaponsLeft { get; set; }
}

public interface IVictim {
    // common methods and properties for PopVictim and TroopVictim
    int Number {get;}
}

public class TroopVictim : IVictim {
    // TroopVictim will be enforced to have IVictim methods and proprieties
    public int Number{ get {return 1; } }
} 

public class PopVictim : IVictim {
    // PopVictim will be enforced to have IVictim methods and proprieties
    public int Number{ get {return 100; } }
} 
用法:

 Console.WriteLine(weapon.Victims.Number)
朋友

    public interface IVictim
    {
        string SharedProp { get; set; }
    }

    public class TroopVictim : IVictim
    {
        public string SharedProp { get; set; }

        public string TroopProperty { get; set; }
    }

    public class PopVictim : IVictim
    {
        public string SharedProp { get; set; }

        public string PopProperty { get; set; }
    }

    public class MyGenericVictim
    {
        //Optional Property
        public bool? IsTroopVictim
        {
            get
            {
                if (Victim == null) return null;
                return Victim.GetType() == typeof(TroopVictim);
            }
        }

        public IVictim Victim { get; set; }
    }


    public class UseMyOfVictim
    {
        public void Bar()
        {
            Foo(new MyGenericVictim
            {
                Victim = new TroopVictim(),
            });
        }

        public void Foo(MyGenericVictim myvic)
        {
            //Function doesnt know TroopVic or PopVic

            TroopVictim resolvedTroopVic;
            PopVictim resolvedPopVictim;

            if (myvic.Victim.GetType() == typeof(TroopVictim))
            {
                resolvedTroopVic = (TroopVictim) myvic.Victim;
            }
            else if (myvic.Victim.GetType() == typeof(PopVictim))
            {
                resolvedPopVictim = (PopVictim) myvic.Victim;
            }

            string success = resolvedPopVictim.PopProperty;
            success = resolvedTroopVic.TroopProperty;
        }
    }

您可以尝试使用
enum
,例如:
enum受害者{team,Population}
。我知道,但我需要存储在对象中的额外信息。“名称”本身是不够的。您需要存储哪些额外的信息?基类应该是
被害人
。从受害者那里获得
部队
人口
。您也可以尝试一下,我的主要要求是保留相关部队/人口对象的连接/外键。在这里,我只会创建新的,这对我的问题没有帮助。我想我只能让部队/人口从受害者那里继承。。或者我误解了什么?我的主要要求是保留相关部队/人口对象的连接/外键。在这里,我只会创建新的,这对我的问题没有帮助。我想我只能让部队/人口从受害者那里继承。。还是我误解了什么?
 Console.WriteLine(weapon.Victims.Number)
    public interface IVictim
    {
        string SharedProp { get; set; }
    }

    public class TroopVictim : IVictim
    {
        public string SharedProp { get; set; }

        public string TroopProperty { get; set; }
    }

    public class PopVictim : IVictim
    {
        public string SharedProp { get; set; }

        public string PopProperty { get; set; }
    }

    public class MyGenericVictim
    {
        //Optional Property
        public bool? IsTroopVictim
        {
            get
            {
                if (Victim == null) return null;
                return Victim.GetType() == typeof(TroopVictim);
            }
        }

        public IVictim Victim { get; set; }
    }


    public class UseMyOfVictim
    {
        public void Bar()
        {
            Foo(new MyGenericVictim
            {
                Victim = new TroopVictim(),
            });
        }

        public void Foo(MyGenericVictim myvic)
        {
            //Function doesnt know TroopVic or PopVic

            TroopVictim resolvedTroopVic;
            PopVictim resolvedPopVictim;

            if (myvic.Victim.GetType() == typeof(TroopVictim))
            {
                resolvedTroopVic = (TroopVictim) myvic.Victim;
            }
            else if (myvic.Victim.GetType() == typeof(PopVictim))
            {
                resolvedPopVictim = (PopVictim) myvic.Victim;
            }

            string success = resolvedPopVictim.PopProperty;
            success = resolvedTroopVic.TroopProperty;
        }
    }