2016-10-07 19 views
1

CreateMessage class私はTCPClientからの着信メッセージを処理し、ユーザータイプを取得し、メッセージをどのように呼び出してmethodにフォーマットするかを返すことを意図しています。方法GetUserTypeC#メソッドのパラメータとして汎用クラスを渡す

、私はUserTypeTypeをとるgeneric abstract classあるパラメータとしてUserBaseTypeを渡したいです。しかし、それは私にエラーを与える:

Using the generic type 'UserTypeBase' requires one type argument.

私はまだジェネリック医薬品と制約を使用してのまわりで私の頭をラップしようとしているので、私はこれについて間違った道を進んだ場合、私は知りません。私は自分自身で解決策を見つけようとするために少し掘り下げましたが、私がやろうとしていることに多少なりとも合うものは見つけられませんでした。

internal class CreateMessage 
{ 
    internal static string user; 
    internal static string message; 

    internal CreateMessage(string data) 
    { 
     user = Lists.users[data.Substring(1, 3)]; 
     message = data.Substring(5, data.Length - 5); 
    } 

    private UserType GetUserType(UserTypeBase type) 
    { 
     return type.CreateType(); 
    } 

    internal string Message() 
    { 
     UserType Type = null; 
     if (user.Contains("[M]")) 
      Type = GetUserType(UserMod); 
     else if (user.Contains("[B]")) 
      Type = GetUserType(UserVIP); 
     else 
      Type = GetUserType(UserRegular); 
     return Type.Message(); 
    } 
} 

UserBaseType.cs

internal abstract class UserTypeBase<T> where T: UserType 
{ 
    public abstract string User { get; } 
    public abstract string Message { get; } 
    public abstract T CreateType(); 
} 

答えて

4

はあなたにも、一般的なパラメータを取る方法を作りたいとしています。コンパイルエラーを避けるために型制約をパラメトリック型に現われるようにミラーリングしたいだけでなく、メソッドに許容されるものと許容できないものを明示することも必要です。

private T GetUserType<T>(UserTypeBase<T> type) where T : UserType 
{ 
    return type.CreateType(); 
} 

状況に応じて明示的または暗黙的に指定されたタイプで呼び出すことができます。

var someType = new UserTypeDerived<UserType>(); 
var resultImplicit = GetUserType(someType); 
var resultExplicit = GetUserType<UserType>(someType); 

それは一般的に使用されているパラメーターのため、コンパイラは、暗黙Tの期待値は、指定されたパラメータの種類に基づいているかを決定することができます。

+0

ああ、あなたは角括弧でメソッドを呼び出すときにパラメータ型を渡すだけでしょうか? –

+0

私はこれをカバーするために私の答えにも拡大しました。 –

+0

あなたがそれを遠くに進めているなら、それは強く型付けされた関数の結果を得るために 'private T GetUserType (UserTypeBase タイプ)T:UserType'にしたいでしょう。 –

関連する問題