質問

私についてc#のアクセス方法を静memebers...も書かないことにしましたかについての説明(ヤの種類にはトレードオフが存在しますが問題になったりします。 まで過ごせばよいかを教えてくれるサンプルコード:

Class test<T>{
     int method1(Obj Parameter1){
         //in here I want to do something which I would explain as
         T.TryParse(Parameter1);

         //my problem is that it does not work ... I get an error.
         //just to explain: if I declare test<int> (with type Integer)
         //I want my sample code to call int.TryParse(). If it were String
         //it should have been String.TryParse()
     }
}

本日は本当にありがとうございう答えの方に問題はそこまでは、この問題を解決せず、エラー)。これは非常に簡単に質問しています!

メニクラス


編集:リオデジャネイロ回答!

がんの試み-キャッチフレーズは、最もエレガントなかからタワーオブセブンコーツとポメラvbできるbummer.使用したことは一度も約30分でプログラムを実行し、その後でしたが2分を計算するだけで避けてみて-することができました。

これを選んだ理由のswich算として最良の答えです。これはコードを複雑なものか想像できる比較的速いのですが、比較的簡単に読み出します。をもたなければならないと思いがよりこれまでにない...もしかし次の言語の私の名前は載っていませんでした:P)


ものを持っていればその他の提案をいまだ待って(人参加)

役に立ちましたか?

解決

一文について教えてくださいこの時に一部の反射をミックス:

static class Parser
{
    public static bool TryParse<TType>( string str, out TType x )
    {
        // Get the type on that TryParse shall be called
        Type objType = typeof( TType );

        // Enumerate the methods of TType
        foreach( MethodInfo mi in objType.GetMethods() )
        {
            if( mi.Name == "TryParse" )
            {
                // We found a TryParse method, check for the 2-parameter-signature
                ParameterInfo[] pi = mi.GetParameters();
                if( pi.Length == 2 ) // Find TryParse( String, TType )
                {
                    // Build a parameter list for the call
                    object[] paramList = new object[2] { str, default( TType ) };

                    // Invoke the static method
                    object ret = objType.InvokeMember( "TryParse", BindingFlags.InvokeMethod, null, null, paramList );

                    // Get the output value from the parameter list
                    x = (TType)paramList[1];
                    return (bool)ret;
                }
            }
        }

        // Maybe we should throw an exception here, because we were unable to find the TryParse
        // method; this is not just a unable-to-parse error.

        x = default( TType );
        return false;
    }
}

次のステップとしているという実

public static TRet CallStaticMethod<TRet>( object obj, string methodName, params object[] args );

フルパラメータの型マッチング等

他のヒント

問題はTryParse定義されていない、またはインタフェース基底クラスでもどこでもできるのであるかのように映像化していることを前提としのタイプに渡されるクラスをしている機能です。ない限り、できるcontrain Tの方法で、走るころがいっぱいあるんです!

制約型のパラメータ

問がございます。

長い回答できるチ:

public class Example
{
    internal static class Support
    {
        private delegate bool GenericParser<T>(string s, out T o);
        private static Dictionary<Type, object> parsers =
            MakeStandardParsers();
        private static Dictionary<Type, object> MakeStandardParsers()
        {
            Dictionary<Type, object> d = new Dictionary<Type, object>();
            // You need to add an entry for every type you want to cope with.
            d[typeof(int)] = new GenericParser<int>(int.TryParse);
            d[typeof(long)] = new GenericParser<long>(long.TryParse);
            d[typeof(float)] = new GenericParser<float>(float.TryParse);
            return d;
        }
        public static bool TryParse<T>(string s, out T result)
        {
            return ((GenericParser<T>)parsers[typeof(T)])(s, out result);
        }
    }
    public class Test<T>
    {
        public static T method1(string s)
        {
            T value;
            bool success = Support.TryParse(s, out value);
            return value;
        }
    }
    public static void Main()
    {
        Console.WriteLine(Test<int>.method1("23"));
        Console.WriteLine(Test<float>.method1("23.4"));
        Console.WriteLine(Test<long>.method1("99999999999999"));
        Console.ReadLine();
    }
}

私は静的な辞書を持参のTryParse方法のひといいかもしれませんね。そして書いた汎用的な方法の辞書とともに、適切な限ります。また、各委員は、異なるタイプのうち、店舗としてオブジェクト参照、それを鋳型で固めての適切な汎用タイプの場合はいつ取得します。このための簡単な例として省エラーチェックなどを確認しており入力辞書に指定されたタイプです。

アクセス会員の特定のクラスまたはインタフェースを使用する必要があり、場所をキーワードを指定しまたはインタフェース基底クラスとしての研究"に関するお問合せ

上記のインスタンスTryParseから生まれるものではない、またはインタフェース基底クラスで、何をしようとはできません。ベストだけます。ChangeType、try/catchです。

class test<T>
{
    T Method(object P)
    {
       try {
           return (T)Convert.ChangeType(P, typeof(T));
       } catch(Exception e) {
           return null;
       }
    }
}

なんて思ったこと。

Class test<T>
{
     T method1(object Parameter1){

         if( Parameter1 is T ) 
         {
              T value = (T) Parameter1;
             //do something with value
             return value;
         }
         else
         {
             //Parameter1 is not a T
             return default(T); //or throw exception
         }
     }
}

残念ながらできませんのTryParseパターンをそのまま静を残念ながらこんに特に適してジェネリック医薬品.

けいえんまりとした使うの反射チェックの場合の方法が存在しT.

別のオプションのためのオブジェクトに送信するには転換オブジェクトによる抑制にIConvertible(すべてのプリミティブ型の実施IConvertible).ることもできるので換されたパラメータを指定された型のものにも柔軟にお応えいたします。

Class test<T>
{
    int method1(IConvertible Parameter1){

        IFormatProvider provider = System.Globalization.CultureInfo.CurrentCulture.GetFormat(typeof(T));

        T temp = Parameter1.ToType(typeof(T), provider);
    }
}

きものバリエーションを用の"オブジェクト型ではなくようにいたします。

Class test<T>
{
    int method1(object Parameter1){

        if(Parameter1 is IConvertible) {

            IFormatProvider provider = System.Globalization.CultureInfo.CurrentCulture.GetFormat(typeof(T));

            T temp = Parameter1.ToType(typeof(T), provider);

        } else {
           // Do something else
        }
    }
}

Okん:全体的には、魚です。今回答及び私の研究の記事 制限汎用タイプのプリミティブの してもらっていますが現在まで。

Class a<T>{
    private void checkWetherTypeIsOK()
    {
        if (T is int || T is float //|| ... any other types you want to be allowed){
            return true;
        }
        else {
            throw new exception();
        }
    }
    public static a(){
        ccheckWetherTypeIsOK();
    }
}

この最初がやりたかっただけで解決が一定のシナリオできの良い代替:できる追加の権限を委譲の方法です。

を解明し、そのようなプログラムを利用しましょう。ということか、また汎用のファクトリメソッドは、インスタンスを生成しますので、していない場合については、呼び出して、もう一つの方法は、通知または追加を設定する処理です。

考え、以下の単純なクラス:

public class Example
{
    // ...

    public static void PostInitCallback(Example example)
    {
        // Do something with the object...
    }
}

次のstaticメソッド:

public static T CreateAndInit<T>() where T : new()
{
    var t = new T();
    // Some initialization code...
    return t;
}

なっているとい:

var example = CreateAndInit<Example>();
Example.PostInitCallback(example);

しかし、この変更方法を追加でかかdelegate:

public delegate void PostInitCallback<T>(T t);
public static T CreateAndInit<T>(PostInitCallback<T> callback) where T : new()
{
    var t = new T();
    // Some initialization code...
    callback(t);
    return t;
}

現在までの変更は電話で:

var example = CreateAndInit<Example>(Example.PostInitCallback);

これは明らかだけに役立つ非常に具体的なシナリオ.これは、最もクリーンなソリューションと感じてコンパイル時に安全な"ハッキング"に関する事のコードは死んだシンプルです。

きっと思います。

最初の場合の動きが必要です。強化が大きくなるにつれ形成されるようにtypecheckerできるだき換Tであったが、実際には、staticメソッドを呼TryParse.

といっ月 制限汎用タイプのプリミティブの.この場合に過ごせばよいかを教えてくれるでポインタの制限の種類に渡すことができるのは、一般から TypeParse さんありがとうござ定められたプリミティブ( 文字列になります。TryParse 明らかにされる例外ではな意味).

まりに応じた個別アドバイスを受けるタイプで、その作業をしようと構文解析します。必要なビットの醜いスイッチが、正しい TryParse ができる思いますので目的可能です。

あなたが必要か説明に記載さらに、そしてください:)

ベストコード:限定T ValueTypeこの方法:

class test1<T> where T: struct

は"struct"ここでいう価値タイプです。文字列は、クラスではなく、価値の型です。int,float,Enums全ての値です。

ちなみにコンパイラは電話における静的メソッドまたはアクセスのstaticメンバの型パラメータ'のように、以下の例のないコンパイル:(

class MyStatic { public static int MyValue=0; }
class Test<T> where T: MyStatic
{
    public void TheTest() { T.MyValue++; }
}

=>エラー1'T'が'typeパラメータ'ではないで有効な、指定されたコンテキスト

目立つ存在です。

などの統計です。よく考えての統計などのようなグローバルクラスの場合でも彼は全ビバップからハードバップの種類です。私のお薦めはで物件内はTれるインスタンスにアクセスでき、必要な静的な方法です。

または実際のインスタンスで何か、というのがそうであるように他のインスタンスができないアクセスの統計は、その型のインスタンスを生成。ここでは一例をどうするかということ:

class a {
    static StaticMethod1 ()
    virtual Method1 ()
}

class b : a {
    override Method1 () return StaticMethod1()
}

class c : a {
    override Method1 () return "XYZ"
}

class generic<T> 
    where T : a {
    void DoSomething () T.Method1()
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top