1

私はこのようなものを持っています

public void FunctionName<T>(){

}

これを呼び出すには、次のようなものが必要です

sub main(){
    FunctionName<Integer>();
}

私の質問は、整数を「整数」として渡すことはできますか?

sub main(){
    FunctionName<"Integer">();
}

またはそれ以外の方法はありますか

これが私の実際のコードです

private static T Convert<T>(DataRow row) where T : new()
{
    T model = new T();
    Type modelType = model.GetType();
    FieldInfo[] fields = null;
    FieldInfo field = default(FieldInfo);
    Type fieldType = null;
    string fieldName = null;

    fields = modelType.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static);

    foreach ( field in fields) {
        fieldType = field.FieldType;
        fieldName = field.Name.Replace("_", string.Empty);
        Interaction.CallByName(model, fieldName, Microsoft.VisualBasic.CallType.Set, GetValue(row, fieldName, fieldType.Name));
    }

    return model;
}


static void main(){
    Student s;

    s = Convert<Student>(DatabaseRow);
}

ここでの問題は、このコードを使用する場所から Student を文字列 ("Student") としてしか取得できないことです。これを正しく行うための他の解決策はありますか?

4

3 に答える 3

6

コードを詳しく見ないと、このようなメソッドを呼び出すための正当なユース ケースがあるかどうかを確実に判断するのは困難です。FunctionNameただし、が class に含まれていると仮定するとFoo、リフレクションを使用してメソッドを呼び出すことができます。

var foo = new Foo();
var typeName = "System.Int32";
var method = typeof(Foo).GetMethod("FunctionName");
var genericMethod = method.MakeGenericMethod(Type.GetType(typeName));
genericMethod.Invoke(foo, new Type[0]);

Integerこれは実際の型名ではないため、使用できないことに注意してください。(intまたはC# のいずれかですが、コンパイラに組み込まれているためのみ有効です) また、apply による型の取得に関する通常の注意事項はすべてここInt32Int32あります (カスタム型が見つからない状況はたくさんあります)。GetTypeintType.GetType

于 2012-08-05T16:15:31.530 に答える
4

いいえ、できません。コンパイル時に型がわかっている場合にのみ、ジェネリックを使用する必要があります。それがジェネリックの要点です。コンパイル時の安全性を強制します。あなたの場合のように、コンパイル時にタイプがわからない場合は、達成しようとしていることに応じて、リフレクションまたはその他の手法を使用できます。

于 2012-08-05T16:10:21.700 に答える
0

Darinの答えに加えて:関数が指定された型用にコンパイルされていない場合(単にこの型に対して明示的に呼び出されていないため)、コードはまったく利用できません。

于 2012-08-05T16:17:44.733 に答える