• 締切済み

C# LINQ 継承クラスに射影充填したい

kekyo0の回答

  • kekyo0
  • ベストアンサー率62% (5/8)
回答No.1

お勧めの方法ではないのですが、Reflectionを使ってコピーする方法があります。 以下の拡張メソッドで、クエリパイプラインをつなげることが出来ます。 // 一応、whereで縛りを入れる public static IEnumerable<T> FakeUpCast<T, U>(this IEnumerable<U> from) where T : U, new() { return new FakeUpCastIterator<T, U>(from); } private sealed class FakeUpCastIterator<T, U> : IEnumerable<T> where T : U, new() { private static readonly object[] emptyIndex_ = new object[0]; private static readonly IEnumerable<PropertyInfo> properties_ = from pi in typeof(U).GetProperties() where pi.CanRead && pi.CanWrite && pi.GetIndexParameter().Length == 0 select pi; private readonly IEnumerable<U> from_; public FakeUpCastIterator(IEnumerable<U> from) { from_ = from; } public IEnumerator<T> GetEnumerator() { foreach (var value in from) { var newValue = new T(); foreach (var pi in properties_) { var pv = pi.GetValue(value, emptyIndex_); pi.SetValue(newValue, pv, emptyIndex_); } yield return newValue; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } // 使うとき var jobE = (from job in context.Jobs where job.xxx == yyy select job). FakeUpCast<JobE>();

関連するQ&A

  • C#で、LINQを使ってデータベースに書き込みたい

    C#で、LINQを使ってデータベースに書き込みたい LINQに関して、全くの初心者なのでお手柔らかにお願いします。 データベースのテーブル "A" の中身は、 id (string型) hoge (string型) 以上の二つ。 このテーブルに対して、データを書き込むには using (var db = new DataContext()) { db.Log = Console.Out; var storSales =db.A.Select(st => new { st.id, st.hoge }); } このような感じではないかと思いましたが、全然、分かりません。 SQLの構文も分からないのも、起因していますか・・・。 id と hoge にデータを書き込むには どのようにしたらいいでしょうか。 また、参考になりそうなWebページや、お勧めの参考書も教えてください。 以上、よろしくお願いします。

  • flashのクラスで

    クラスのプロパティでurlと画像を設定したいのですが、 書き方が分かりません。 class a{ private var url (URL:String); private var picture (URL:String); } これは間違っているでしょうか。 この書き方はあっていますか? すみませんがお願いします。 var url=new()。。と書くのでしょうか? クラスを複製して、 それが個々に別々のurlを持つようにしたいです しみませんがお願いします

    • ベストアンサー
    • Flash
  • 継承元クラスのプロパティを参照する手段

    お世話になります。 ActionScrip3に関する質問です。 現在、カスタムクラスを勉強しております。 外部クラスでClassA、ClassBを作成し、 ClassAにある処理の途中でClassBを実行し、ClassBの中からClassAのプロパティを参照しにいく 処理を行いたいと思い、ClassBのコンストラクタからClassAのプロパティをtraceしました。 プロパティppt2は「かきくけこ」が出力されましたが、ppt1は「null」になってしまいました。 恐らく、タイムラインからClassAに対して設定したプロパティの値は見にいけていないようですが、 タイムラインから設定したプロパティの値を継承したClassBから参照しにいく方法はありますでしょうか? 下記ソースと同じ方法でなくても結構ですので、タイムラインから設定した スーパークラスのプロパティ値をサブクラスから参照・変更できる方法を ご教授いただければと存じます。 お手数ではありますが、宜しくご教授ください。 宜しくお願いいたします。 /* タイムライン側の処理 -----------------------*/ var test:ClassA = new ClassA(); test.ppt1 = "あいうえお"; test.goNext(); /* ClassAの処理 -----------------------*/ package {  // インポート記述は省略  public class ClassA {   var ppt1:String;   var ppt2:String = "かきくけこ";   // コンストラクタ   public function ClassA() { }   public function goNext():void {    var classb:ClassB = new classB();   }  } } /* ClassBの処理 -----------------------*/ package {  // インポート記述は省略  public class ClassB extends ClassA {   // コンストラクタ   private function ClassB() {    trace(ppt1);    trace(ppt2); }  } }

    • ベストアンサー
    • Flash
  • 継承したクラス側のクラス名の取得

    C#3.5を使用しています。 BaseClassはStackTraceを使ってクラス名を取得できるメソッドを持っています。 それを継承したDerivedClass側でそのクラス名「DerivedClass」を取得したいのですが、 次のようなやり方では「BaseClass」が取得されてしまいます・・・ あくまでBaseClass側に記述したメソッドのままで、DerivedClass側のクラス名を取得するには どのようにしたら良いのでしょうか? public class BaseClass { public string className; public string ClassName { get { if (className == null) { StackTrace st = new StackTrace(false); StackFrame sf = st.GetFrame(0); className = sf.GetMethod().ReflectedType.Name; } return className; } set { className = value; } } } public class DerivedClass : BaseClass { } var c = new DerivedClass(); MessageBox.Show(c.ClassName);// BaseClassと表示される

  • 【C#】LINQについての質問です。

    【C#】LINQについての質問です。 今、プログラミングLINQ(日経BP)の本を読んでいるのですが、わからないところがありましたので、お分かりの方に教えていただきたいです。 問題の場所は、P87のリスト3-43で、以下のコードです。 わからないのは、このコードの中で、ラムダ式のtとsが何にを指しているのかということです。 お分かりになる方、よろしくお願いいたします。 var expr = from c in customers join o in (from c in customers from o in c.Orders join p in products on o.IdProduct equals p.IdProduct select new { c.Name, o.IdProduct, o.Month, OrderAmount = o.Quantity * p.Price }) on c.Name equals o.Name into orders select new { c.Name, MaxOrder = orders .Aggregate( new { Amount = 0m, Month = String.Empty }, (t, s) => t.Amount > s.OrderAmount ? t : new { Amount = s.OrderAmount, Month = s.Month }) };

  • 違うクラスからの変数の共有化

    一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m // 共有化させたい変数を持つクラス // Var.java public class Var{  public static int i;  public Var(int i){ this.i = i; }  public Var(){}  public static void getI(){   return i;  } } //クラス1 //Class1.java public class Class1{  Var var = new Var(1); } //クラス2 //Class2.java public class Class2{  Var var = new Var();  System.out.println(var.getI()); } とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。 まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・ たとえば、PrintStreamクラスの public static final PrintStream out というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・ このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。 どうかお願いします。

    • ベストアンサー
    • Java
  • コンストラクタの記述について ―引数を持ったクラスを継承する場合―

    コンストラクタの記述について ―引数を持ったクラスを継承する場合― ActionScript3.0でプログラミングをしています。 クラスの継承に挑戦したのですが、うまくいきません。 コンストラクタの記述は、何か特別なものが必要なのでしょうか? ■コンストラクタに引数なし → 成功。 ■コンストラクタに引数あり → 失敗。  エラー「No default constructor found in base class <親クラスの名前>」。 ■エラーの出るソース↓ ・Main.as(コンストラクタ内抜粋)     var parent:Parent = new Parent(100);     var child:Child = new Child(200); ・Parent.as package {   import flash.display.Sprite;      public class Parent extends Sprite {     protected var str:String = "親クラスのプロパティ";     public function Parent(inNum:Number):void {       trace("親クラス, ", str, inNum);     }   } } ・Child.as package {   import Parent;   public class Child extends Parent {     public function Child(inNum:Number):void { //■エラー。       trace("子クラス, ", str, inNum);     }   } } ご存知の方、よろしくお願いします。 よろしくお願いします!

    • ベストアンサー
    • Flash
  • javaの配列とクラス

    abstract class abstract_class{ } class subclassA extends abstract_class{ int num = 1; } class subclassB extends abstract_class{ int num = 2; } class subclassC extends abstract_class{ int num = 3; } class Main{ public static void main(String args[]){ int sum = 0; abstract_class var[] = new abstract_class[3]; var[0] = new subclassA(); var[1] = new subclassB(); var[2] = new subclassC(); for(int i=0;i<3;i++) sum += var[i].num; System.out.println(sum); } } これをコンパイルすると Main.java:23: シンボルを見つけられません。 シンボル: 変数 num 場所 : abstract_class の クラス for(int i=0;i<3;i++) sum += var[i].num; ^ エラー 1 個 というエラーが出るのはなぜでしょうか? var[i]はみなsubclassA,subclassB,subclassCが代入されているのに、numはabstract_classの変数となっています。 よくわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • クラスメンバ・メソッドは継承しない?

    クラスのインスタンスオブジェクトで不変なクラスメンバとメソッドを定義したいのですが、継承クラスでエラーが出ます。 -------------------------------------------------------------------ここから function baseClass() { this.instStr = "base class instance property"; } baseClass.prototype.prtMethod = function(){return this.instStr;}; baseClass.clsStr = "base class property"; baseClass.clsMethod = function(){return baseClass.clsStr;}; base_inst = new baseClass(); alert( "baseClass:\n" + "\tinstStr = " + base_inst.instStr + "\n" + "\tprtMethod = " + base_inst.prtMethod() + "\n" + "\tclsStr = " + baseClass.clsStr + "\n" + "\tclsMethod = " + baseClass.clsMethod() + "\n" ); function upperClass() { this.instStr = "upper class instance property"; } upperClass.prototype = new baseClass; upper_inst = new upperClass(); alert( "upperClass:\n" + "\tinstStr = " + upper_inst.instStr + "\n" + "\tprtMethod = " + upper_inst.prtMethod() + "\n" + "\tclsStr = " + upperClass.clsStr + "\n" + "\tclsMethod = " + upperClass.clsMethod() + "\n" ); /* Exception: upperClass.clsMethod is not a function @Scratchpad:30 */ -------------------------------------------------------------ここまで 実行は Firefox 付属のスクラッチパッドで行いました。 期待する結果は、upperClass.clsStr がベースクラスで設定した"base class property"、upperClass.clsMethod() がその文字列を返す関数となって欲しいのです。 そもそも、Javascript ではクラス定義内部と prototype で設定したメンバとメソッドしか継承できないのでしょうか? あるいは他の方法がある?

  • 継承クラスで定義したメソッドのtry-catch文

    親クラスで、子クラスで実装されたメソッドのExceptionをキャッチしたいのですが、 うまくいきません。 何か良い方法はないでしょうか? abstract class A { public __construct(){ try{ $this->testA(); }catch(Exception $e){ var_dump(1); } } abstract function testA(); } class B extends A { function testA(){ throw Exception('test',1); } } try{ new B; }catch(Exception $e){ var_dump(2); // こっちが動く } よろしくお願いします。

    • ベストアンサー
    • PHP