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();