私はC#の初心者の開発者です(SQLの背景から来ています)ので、この質問の用語のいくつかは間違っている可能性があります。派生クラスのObservableCollection
私はC#/ WPF/SQLiteを使用して、食品消費追跡アプリケーションを作成しようとしています(あなたが食べた食事やカロリーなどを追跡することができます)。 EFでAdd-Modelウィザードを使用して、DatabaseピースとEntityモデルを作成しました。
Iは、上記のコードが自動生成されたので
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; }
}
ように、ConsumptionLogエンティティを有します。私がしようとしているのは、ComsumptionLogを別のクラスに拡張して、プロパティを追加することです。たとえば、これは...私は明らかに、これが動作していないと私時点でアップトリップれるこの
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);
}
のようなものを使用することができることを目指して
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
{
}
}
}
スニペットです派生クラスに基本クラスのObservableCollection(ConsumptionLog)をキャストしようとしています(ConsumptionLogView)
私の質問をした:
- コードは基本クラスしかなく、コードの合計カロリー部分が で修正されました。その時点で、 データベース構造を少し修正してVSでリフレッシュすると、 のクラスとコードが上書きされました。だから私は というこの道を歩み始め、追加コードを分離しました。私は間違って何をしようとしています (クラスのコードを分ける)のような何か?
- もしそうでなければ、私は基本クラスobsを設定しようとしています。 coll。コレクションの内容を派生クラスobsに「コピー」することになります。コレクション?私はConsumptionLogViewにConsumption +のすべてがあるので、私はそれをキャストできると思った。
私はSOなどの場所を検索しましたが、何を検索するのか正確には分からなかったので、助けていただければ幸いです。他の作業例へのポインタがあれば、それは私が始めることができる場所でもあります。事前に
おかげで、 S
'ConsumptionLog'は、あなたがシンプルに拡張できる部分クラスです。継承を使用する代わりに既存のクラスを拡張することを考えましたか?これはあなたの問題を解決する可能性があります。 – Fruchtzwerg
実際、ConsumptionLogのコードは、Add New Modelウィザード(edmx)を使用したときに自動的に作成されました。最初のアプローチは、(1)で述べたように、このクラスを拡張することでしたが、基盤となるDB構造を変更し、Visual Studioで 'データベースからモデルをリフレッシュ'した場合、このクラスは上書きされ、私は再びすべての変更を書き直さなければならなかった。私は一つの解決策はリフレッシュしないことだと思いますが、それは私にはハイリスクのアプローチのようです。 –
部分クラスを2番目のファイルで拡張することができます。これが、ほとんどの自動生成されたクラスが部分的な理由です。これは、変更がジェネレータによって上書きされない別のファイルにあることを意味します。 – Fruchtzwerg