我有一個名爲BaseStatus一個基類,它看起來是這樣的:找到它從特定的基類派生的所有類,並將其添加到註冊表
public class BaseStatus
{
public int UnitId { get; protected set; }
public UInt16 StatusValue { get; protected set; }
public string StatusCode { get; protected set; }
public string StatusDescription { get; protected set; }
public BaseStatus()
{
this.UnitId = -1;
this.StatusValue = 0;
this.StatusCode = null;
this.StatusDescription = null;
}
}
而且我有一個派生自兩個或多個其他基類BaseStatus並定義其他單位ID。例如,兩類
public class BaseGlobalStatus : BaseStatus
{
public BaseGlobalStatus()
{
base.UnitId = -1;
}
}
public class BaseGcmGdmStatus : BaseStatus
{
public BaseGcmGdmStatus()
{
base.UnitId = 2;
}
}
public class BaseCcuStatus : BaseStatus
{
public BaseCcuStatus()
{
base.UnitId = 1;
}
}
的背景是,我想從例如BaseCcuStatus派生並有正確的UnitID在派生類中。
現在我定義我正確的狀態類,例如:
public class StatStErrDefinition : BaseGlobalStatus
{
public StatStErrDefinition()
: base()
{
base.StatusDescription = "Kommando nicht zulässig, unit im state ERROR";
base.StatusCode = "STAT_ST_ERR";
base.StatusValue = 3;
}
}
public class GcmStErrDefinition : BaseGcmGdmStatus
{
public GcmStErrDefinition()
: base()
{
base.StatusDescription = "Kommando nicht zulässig, unit im state ERROR";
base.StatusCode = "STAT_ST_ERR";
base.StatusValue = 3;
}
}
public class CcuStErrDefinition : BaseCcuStatus
{
public CcuStErrDefinition()
: base()
{
base.StatusDescription = "Kommando nicht zulässig, unit im state ERROR";
base.StatusCode = "STAT_ST_ERR";
base.StatusValue = 3;
}
}
對於我understading,三類StatStErrDefinition,GcmStErrDefinition和CcuStErrDefinition都應該有在派生BaseClass的設置單元ID?
現在我已經定義了我的三個狀態類,我想讓它們進入註冊表。目前即時通訊使用這段代碼來嘗試獲取它們。問題是結果沒有項目。
registry = new StatusDictionary<UInt16, BaseStatus>();
var unitStatus = typeof(BaseStatus)
.Assembly.GetTypes()
.Where(x => x.BaseType == typeof(BaseStatus))
.Select(x => new
{
StatusType = x,
UnitId = x.GetProperty("UnitId", BindingFlags.Public)
StatVal = x.GetProperty("StatusValue", BindingFlags.Public)
}
)
.Where(x => x.StatVal != null && x.UnitId != null)
.Select(x => new
{
UnitId = (int)x.UnitId.GetValue(null, null),
StatusValue = (UInt16)x.StatVal.GetValue(null, null),
Factory = (Func<BaseStatus>)(() => ((BaseStatus)Activator.CreateInstance(x.StatusType)))
});
try
{
foreach (var status in unitStatus)
{
if (status.UnitId == unitId
|| status.UnitId < 0)
registry.Register(status.StatusValue, status.Factory);
}
}
catch (Exception ex)
{
string temp = ex.Message;
}
的LINQ表達了var unitStatus爲空後...
後來,註冊表調用看起來像要得到具體類但這是不重要的,在這一點上:
stat = StatusContainer.GetRegistry(this.unitTypeId).GetInstance(this.StatusValue);
有關信息: 我想通過unittypeid和特定的狀態值來獲取應在註冊表中的狀態類。 目前我的註冊表方法不起作用,因爲他無法找到任何類。所以在某個地方肯定會出錯。在此先感謝
#UPDATE 1
我改變了我的一點點功能:
registry = new StatusDictionary<UInt16, BaseStatus>();
//get all types of cucrent assembly
var allAssemblyTypes = Assembly.GetCallingAssembly().GetTypes();
//get all types from base status
var baseStatusTypes = allAssemblyTypes.Where(x => x.BaseType == typeof(BaseStatus));
//Place all concrete types in the foundtypes
List<Type> foundTypes = new List<Type>();
foreach (Type item in baseStatusTypes)
{
var temp = allAssemblyTypes.Where(x => x.BaseType == item)
.Select(x => new
{
StatusType = x,
UnitId = x.GetProperty("UnitId", BindingFlags.Public),
StatVal = x.GetProperty("StatusValue", BindingFlags.Public),
}
);
}
溫度現在包含正確的類型。 問題是,如果temp是StatStErrDefinition類型,則StatusValue和UnitId屬性爲null。 事實是,這些成員是實例成員。有沒有辦法從他們那裏獲取價值?
x.BaseType會給你眼前的繼承,而不是父母的父母,你可以在這裏閱讀 - http://msdn.microsoft .com/en-us/library/system.type.basetype.aspx –