我是C#的初学者(来自SQL背景),所以这个问题中的一些术语可能不正确......提前出现。
我正在尝试使用C#/ WPF / SQLite创建食物消费跟踪应用程序(允许您跟踪您吃的食物,计算卡路里等)。 我已经使用EF中的添加模型向导创建了数据库部分和实体模型。
我有一个ConsumerLog实体,就像这样
public partial class ConsumptionLog
{
public int consumptionID { get; set; }
public Nullable<int> dayMealNumber { get; set; }
public Nullable<int> foodID { get; set; }
public Nullable<int> mealID { get; set; }
public Nullable<decimal> servings { get; set; }
public System.DateTime logDate { get; set; }
public virtual Meal Meal { get; set; }
public virtual Food Food { get; set; }
}
和
public partial class Food
{
public Food()
{
this.ConsumptionLogs = new HashSet<ConsumptionLog>();
this.MealContents = new HashSet<MealContent>();
}
public int foodID { get; set; }
public string store { get; set; }
public string brandName { get; set; }
public string foodName { get; set; }
public string foodUnit { get; set; }
public Nullable<decimal> foodNoOfUnits { get; set; }
public Nullable<decimal> calories { get; set; }
public Nullable<decimal> carb { get; set; }
public Nullable<decimal> sugar { get; set; }
public Nullable<decimal> protein { get; set; }
public Nullable<decimal> fat { get; set; }
public Nullable<decimal> fibre { get; set; }
public Nullable<decimal> gms { get; set; }
public Nullable<decimal> ml { get; set; }
public short isActive { get; set; }
public virtual ICollection<MealContent> MealContents { get; set; }
}
以上代码是自动生成的。我想要做的是将ComsumptionLog扩展到另一个类中,以添加更多属性。例如,这是一个片段......
public partial class ConsumptionLogView : ConsumptionLog
{
public ObservableCollection<ConsumptionLogView> CLViewList { get; set; }
string _FoodName;
public string FoodName
{
get
{
if (Food == null)
{
return "Total";
}
else
{
return Food.foodName.ToString() + " : "
+ Convert.ToDouble(Food.foodNoOfUnits).ToString() + " " + Food.foodUnit.ToString();
}
}
set
{
}
}
public decimal _Calories;
public decimal Calories
{
get
{
if (Food == null)
{
return _Calories;
}
else
{
return Convert.ToDecimal(Food.calories);
}
}
set
{
}
}
}
我的目标是,我可以使用这样的东西
private void LoadConsumptionLogs()
{
FitnessLogDBEntities ctx = new FitnessLogDBEntities();
var consumptionList = (
from s in ctx.ConsumptionLogs
where s.logDate == LogDate.SelectedDate.Value
select s).ToList<ConsumptionLog>();
ObservableCollection<ConsumptionLogView> conLogViewColl =
(ObservableCollection<ConsumptionLogView>)consumptionList.Cast<ObservableCollection<ConsumptionLogView>>();
var consumptionItem = new ConsumptionLogView();
consumptionItem._Calories = GetTotalCals(conLogViewColl);
conLogViewColl.Add(consumptionItem);
ConsumptionLog.ItemsSource = conLogViewColl;
}
private decimal GetTotalCals(ObservableCollection<ConsumptionLogView> cons)
{
double Total = 0;
foreach (ConsumptionLogView con in cons)
{
Total += Convert.ToDouble(con.Calories);
}
return Convert.ToDecimal(Total);
}
显然,这不起作用,并且正在尝试将基类ObservableCollection(ConsumptionLog)强制转换为派生类(ConsuLogView)
我的问题是:
我搜索了SO和其他地方但是不确定要搜索的内容,所以任何帮助都会受到赞赏。如果有指向其他工作示例的指针,那也是我可以开始的地方。
提前致谢, 小号
答案 0 :(得分:0)
您不一定要使用继承来扩展类。在C#中扩展类的第二种方法是使用部分类。这意味着一个类由多个文件组成。通常,自动生成的类已经是部分的。这意味着扩展课程非常简单。假设代码生成器创建了 ComsumptionLog.cs (请注意partial
标识符)
public partial class ConsumptionLog
{
//Some properties
}
您只需创建第二个文件,例如 ComsumptionLogExtension.cs
public partial class ConsumptionLog
{
//Additional properties and methods
}
包含您需要的所有其他属性和方法。有关更多信息,请查看Microsofts description of partial classes。这样您就不需要转换任何类型,因为类仍然是相同的。如果将扩展文件保存在与生成的文件不同的文件夹中,则代码生成器在生成运行期间不应触摸它。请注意,命名空间必须相同。
我认为这种方法应该以非常简洁的方式解决您的问题。