C# 获取基类类型

C# 获取基类类型,c#,class,types,C#,Class,Types,我相信这个帖子的名字与这个问题没有多大关系,但我无法表达得更好 我有以下课程: public class BuyAction { public Deals Deals{ get; set; } } public class SellAction { public Deals Deals { get; set; } } public class Deals { public int GetDealValueByType(object obj) {

我相信这个帖子的名字与这个问题没有多大关系,但我无法表达得更好

我有以下课程:

public class BuyAction
{
    public Deals Deals{ get; set; }
}

public class SellAction
{
    public Deals Deals { get; set; }
}

public class Deals
{
    public int GetDealValueByType(object obj)
    {
        if (obj.GetType() == typeof (BuyAction))
        {
            return 1;
        }
        if (obj.GetType() == typeof (SellAction))
        {
            return 2;
        }
        return 0;
    }
}

我的问题:
如何在不将参数传递给方法“GetDealValueByType”的情况下返回dealValue?

在您编写的代码中,
Deals
不知道是否存在
BuyAction
SellAction
,因此无法知道哪个类正在使用它。为了做到这一点,你应该以某种方式与它沟通。这是一种方法:

public abstract class BaseAction
{
    private Deals _deals;
    public Deals Deals 
    {
        get
        {
            if (_deals == null)
                 // this = BuyAction or SellAction, never BaseAction because it's abstract
                _deals = new Deals(this);
            return _deals;
        }
        set
        {
            _deals = value;
        }
    }

}

public class BuyAction : BaseAction { }
public class SellAction : BaseAction { }

public class Deals
{
    private BaseAction _callerAction;
    public Deals(BaseAction caller)
    {
        this._callerAction = caller;
    }

    public int GetDealValueByType()
    {
        if (this._callerAction is BuyAction)
        {
            return 1;
        }
        if (this._callerAction is SellAction)
        {
            return 2;
        }
        return 0;
    }
}

public static void Main(string[] args)
{
    BaseAction action = new BuyAction();
    int dealValue = action.Deals.GetDealValueByType();
    // Prints 1
    Console.WriteLine(dealValue);

    action = new SellAction();
    dealValue = action.Deals.GetDealValueByType();
    // Prints 2
    Console.WriteLine(dealValue);
}
如您所见,现在
Deals
类需要一个
BaseAction
类来实例化它。通过这种方式,现在可以强制类知道谁在使用它,然后可以以面向对象的方式做出决策

最后,您得到的不是基类,而是调用者或容器类。在您的示例中,唯一的基类是
object

尝试使用泛型:

public class BaseAction{} 

public class BuyAction : BaseAction
{
    public int Value { get{ return 1; }} 
}

public class SellAction : BaseAction
{
    public int Value { get{ return 2; }}
}

public class Deals<T> where T : BaseAction,  new() 
{
    public int GetDealValue()
    {
        var data = new T();
        return data.Value;
    }
}
public类BaseAction{}
公共集体行动:基本行动
{
公共int值{get{return 1;}}
}
公共集体行动:基本行动
{
公共int值{get{return 2;}}
}
公共类处理,其中T:BaseAction,new()
{
public int GetDealValue()
{
var数据=新的T();
返回数据值;
}
}
然后将其用作:

var deal1 = new Deals<BuyAction>();
var value1 = deal1.GetDealValue();

var deal2 = new Deals<SellAction>();
var value2 = deal2.GetDealValue();
var deal1=新交易();
var value1=deal1.GetDealValue();
var deal2=新交易();
var value2=deal2.GetDealValue();

这毫无意义。您已经定义了类,这样类的任何用户都可以将
Deals
对象从
BuyAction
复制到
SellAction
。如果你给你的类的用户这种自由,那么
Deals
对象就不可能希望告诉你你想要它告诉你什么。为什么你不先解释一下你想做什么,而不是如何做。请原谅我不知道如何解释和创建一个毫无意义的类。我现在创建只是为了学习如何获得上面的类的类型。在我的例子中,我在方法中有一个条件,即“GetActionClassType”。根据使用它的类,我将有不同的返回。但是我不想传递参数。这是怎么做的?PS:我编辑了主要问题,以便更容易形象化。要理解你想要实现的目标有点困难,但你的设计可能如前所述是错误的。如果
GetActionClassType
与买卖操作相关,那么将该方法放在那里,忘记
Deals
方法
GetDealValueByType
方法阻止了
Deals
类的使用,我知道这是他要求的,但仍然是错误的。如果它取决于动作的类型,那么动作就是应该具有行为的动作。一个仍然错误,但更好的解决方案是直接将结果传递给构造函数,例如。我想一定有更多的代码来证明这些类的存在。这就是为什么我尽量坚持他的设计。如果他重新设计这个问题,这个答案可能会过时非常感谢你!当你回答我的问题时,你说“不知道BuyAction或SellAction的存在,所以它无法知道哪个类在使用它。”这个问题更多的是为了提供信息。抱歉,它没有预期的那么有用。:)再次感谢您,此选项可能更好。:)
var deal1 = new Deals<BuyAction>();
var value1 = deal1.GetDealValue();

var deal2 = new Deals<SellAction>();
var value2 = deal2.GetDealValue();