2011-07-12 12 views
2

2つのメソッドがあります。そのうちの1つはクラス外にあり、もう1つはクラス内にあります。私はCodeDomを使用して、クラスの外のメソッドからクラスの内部のメソッドに呼び出しを行うことができるようにしたいと考えています。別のクラスから**CodeDomを使用して外部クラスからメソッドを呼び出す

public static class Public 
{ 
    public static byte[] ReadAllData(string sFilePath) 
    { 
     byte[] b = new byte[sFilePath.Length]; 
     b = System.IO.File.ReadAllBytes(sFilePath); 
     return b; 
    } 
} 

:これは

クラス内のメソッドで...コードを使用して説明する方がはるかに簡単になります

Public.ReadAllData(@"C:\File.exe"); 

私がしたいです上記を使用して上記を再作成します。CodeDom -

CodeMemberMethod method = new CodeMemberMethod(); 

method.Statements.Add(new CodePropertyReferenceExpression(
new CodeVariableExpression("Public"), "ReadAllData")); 

上記のコードは、次の出力を生成しますが、パラメータを渡すことができませんでした。

Public.ReadAllData; 
+0

なぜこれを行うにはCodeDomを使用する必要がありますか?あなたは何を解決しようとしていますか? – Amy

+0

私のプロジェクトの全目的はCodeDomを使用することです... –

+0

なぜ人々はいつも自分自身をそんなに傷つけようとしていますか?:) – Tigran

答えて

7
var compiler = new CSharpCodeProvider(); 

var invocation = new CodeMethodInvokeExpression(
    new CodeTypeReferenceExpression(typeof(Public)), 
    "ReadAllData", new CodePrimitiveExpression(@"C:\File.exe")); 

var stringWriter = new StringWriter(); 
compiler.GenerateCodeFromExpression(invocation, stringWriter, null); 
Console.WriteLine(stringWriter.ToString()); 

このコードは、結果

ConsoleApplication1.Public.ReadAllData("C:\\File.exe") 

を生産する別のオプションはCodeMethodReferenceExpressionをこのように使用する

var invocation = new CodeMethodInvokeExpression(
    new CodeMethodReferenceExpression(
     new CodeTypeReferenceExpression(typeof(Public)),"ReadAllData"), 
    new CodePrimitiveExpression(@"C:\File.exe")); 

あるジェネリックメソッドを呼び出すときに役に立つかもしれません:あなたは、コンストラクタに型パラメータを指定することができます。

+0

は魅力的です!美しい答えはありがとう! –

0

私は唯一のCodeDOMを少し使用しましたが、私はあなたの代わりにCodePropertyReferenceExpressionの、CodeMethodInvokeExpressionをしたいと思います。 CodePropertyReferenceExpressionはメソッドを呼び出すのではなく、プロパティ値にアクセスしているステートメントを生成しているようです。

CodeMethodInvokeExpressionには、呼び出すメソッドに渡すパラメータを指定できるParametersプロパティがあります。

+0

ええ、私は問題を1つのクラス内のメソッドにパラメータを渡すが、私は他のクラスのメソッドにパラメータを渡す方法を把握することはできません。それが私の主な問題です。しかし、応答ありがとう。 –

+0

ええ、申し訳ありませんが、私のCodeDomの脳は、それがどのくらい正確に機能するかを思い出すにはあまりにも多くのクモの巣を持っています。私はExpressionTreesを3.5以降使用しています。そのため、以前のCodeDom fooをすべて失ってしまいました – ckramer