2017-03-06 3 views
4

まず、質問題の私の謝罪。私は本当にそれが私が達成しようとしていると呼ばれているので、私はそれにまっすぐになるだろうか分からない。このコードをリファクタリングする方法(C#、Types)

私は現在、GDI +を使ってC#でゲームエンジンを開発しており、コンポーネントクラスを実装しています。アイデアは、どのゲームオブジェクトにも(Unity3Dと同様に)複数のコンポーネントをアタッチすることができ、どのクラスのコンポーネントを探すことができるようにすることです。そのノートオン

、私は、コードのこの部分に変更したいと思います:代わりに、このように見えるように

Rigidbody r = obj.GetComponentOfType(typeof(Rigidbody)) as Rigidbody; 

を:

Rigidbody r = obj.GetComponentOfType<Rigidbody>(); 

は、どのように私はこれをやって行くのですか?

申し訳ありませんが、私の質問があいまいであれば、このトピックにどのような光が当てはまるかは素晴らしいでしょう!

+1

http://answers.unity3d.com/questions/55331/differences-generic-getcomponentscript-vs-getcompo.html – lordkain

答えて

0

あなたのダーティー作業(投稿したコードの最初の行)を行い、ジェネリックタイプを受け入れる拡張メソッドをGetComponentOfTypeメソッドに追加します。 <>タグのRigidbodyタイプを渡すことができます。

拡張メソッドの詳細については、hereを参照してください。

編集:拡張メソッドが静的であることを確認してください。

希望します。

3

objの型にList<Component>フィールドがあるとします。あなたはLinqを使用することができます。

// assuming 
public class GameObject 
{ 
    List<Component> m_Components; // all components attached to this GameObject 
    public TComponent GetComponentOfType<TComponent>() 
     where TComponent : Component 
    { 
     // Select only the ones of type TComponent and return first one 
     return m_Components.OfType<TComponent>().FirstOrDefault(); 
    } 
} 

を、この使用するには:これは一般的な方法と呼ばれている

public static T GetComponentOfType<T>(this [objType] obj) 
where T : class 
{ 
    return obj.GetComponentOfType(typeof(T)) as T; 
} 
1

をあなたがクラスを変更できない場合は、拡張メソッドを使用することができます。

public T GetComponentOfType<T>() 
{ 
    return (T) GetComponentOfType(typeof(T)); 
} 
7

obj.GetComponentOfType<Rigidbody>();

0

これは、ジェネリックを使用して行われます。これは、次のように既存のタイプベースの実装を呼び出すオーバーロードを作成することができます。 GetComponentofTypeメソッドの本体はほぼ同じですが、唯一の違いは、パラメータとして渡すのではなく、ジェネリックで必要な型を指定している点です。剛体と呼ばれるクラスを作成

public T GetComponentOfType<T>(){ 

     //code goes here to locate the object. 
     you can get the type via typeof(T) 

     return theObject; 
} 
0

public class Rigidbody{ 
 
     public int Size{ get; set; } 
 
     public string fourgroundColor{ get; set; } 
 
     public string backgroundColor{ get; set; } 
 
     public int fingerammount{ get; set; } 
 
     public int arms{ get; set; } 
 
    }

方法は、次のようになります。すべてのコンポーネントを使用できるクラスよりもクラスに設定してください。 Olsoはそれを公開します。そうしないと、あなたの例のように使うことはできません。

あなたが言うことができるクラスがあるとき:var r = obj.GetComponentOfType(); olsoはデータ型の代わりにvarを使用します。 varはデータ型がoldscool(C#1またはC2によく似ています)です。0)私は毎回同じミスステークをしました。

using System.Linq; 
using System.Collections.Generic; 

/// <summary> 
/// Base-Class 
/// </summary> 
public abstract class Thing 
{ 
    private ICollection<Thing> _things; 

    public Thing() 
    { 
     _things = new List<Thing>(); 
    } 

    public void AddSomething(Thing toAdd) 
    { 
     _things.Add(toAdd); 
    } 

    /// <summary> 
    /// Assuming that every type can only appear once 
    /// </summary> 
    /// <param name="t"></param> 
    /// <returns></returns> 
    public T GetComonentOfType<T>() where T : Thing 
    { 
     return this.GetComonentOfType(typeof(T)) as T; 
    } 

    public Thing GetComonentOfType(Type t) 
    { 
     return _things.Where(x => x.GetType() == t).Single(); 
    } 

} 

/// <summary> 
/// One possible implementation 
/// </summary> 
public class SpecialThing : Thing 
{ 

} 
+0

この回答はまったく意味がありません。 OPは、コンポーネントを抽出する汎用メソッドを作成する方法について尋ねられ、コンパイル時の型解決メソッドについて書いています。 –

1

VARを使用するように私に言いましたすべてのコンポーネントのクラスは、このクラス(または同様)を継承すると仮定:

public abstract class IComponent 
{ 
    protected IList<object> objComponents; 

    public object GetComponentOfType(Type type) 
    { 
     if (objComponents == null) 
      return null; 

     return objComponents.Where(obj => obj.GetType() == type).FirstOrDefault(); 
    } 
} 

あなただけから継承取得する別のメインマザークラスを作成することができます。

public abstract class BaseComponent : IComponent 
{ 
    public object GetComponentOfType<T>() 
    { 
     return GetComponentOfType(typeof(T)); 
    } 
} 

ファーストクラスへのアクセス権がある場合は、そのファンクションを追加してください。

0

:私はsofware開発者として作業を開始するとき、彼らは、私はあなたが以下のような一般的なメソッドを実装したいと思います(私はolmost medior、まだちょうどジュニアよ)

関連する問題