私は現在、 "Component"と呼ばれるXNAプロジェクトのカスタムタイプを複製しようとしています。ジェネリック型の新しいインスタンスを作成すると、ルート型に変換されますか?
public static TComponent CloneComponent<TComponent>(this TComponent source) where TComponent : Component, new()
{
TComponent clone = new TComponent(); //Create the new instance
//Clone the source code here
return clone;
}
私のプロジェクトでは、実際には自分のメソッドにコードをクローンしていますが、それを削除するために私の質問に何もないからです。私のコンポーネントクラス上のいくつかの説明については
、私はComponent
と呼ばれるルートクラスを持っているが、その後、私はクローンを作成しようとしていますComponent
から派生クラスを作成します。
は、したがって、たとえば、私はコンポーネントが「PlayerController」と呼ばれている可能性があります:
class PlayerController: Component
だから私はPlayerController
I入力のクローンを作成したい場合は、その型の引数として; TComponent
はPlayerController
である必要があります。
したがって、PlayerController
コンポーネントをクローンするとします。
私はコンポーネントでGetType().ToString()
あるソース・コンポーネントの名前デバッグする場合:
Debug.WriteLine(source.name);
を私は出力「PlayerController」を取得します。
つまり、TComponent
はPlayerController
です。右ですか?
しかし、クローンの名前をデバッグすると、新しいインスタンスTComponent
が出力されますが、出力は「コンポーネント」になります。これは、何らかの理由で私の新しいインスタンスTComponent
がルートタイプに変換されたことを意味します??面白いのは何
私はコンソールアプリケーションでこれを再作成するとき、私はこのエラーを取得していないということです...
編集:
テストソース:
static class Program
{
static void Main(string[] args)
{
PlayerController e = new PlayerController();
PlayerController eClone = Extensions.CloneComponent(e);
Console.WriteLine(e.name);
Console.WriteLine(eClone.name);
}
}
public class Component
{
}
public class PlayerController : Component
{
}
public static class Extensions
{
public static TComponent CloneComponent<TComponent>(this TComponent source) where TComponent : Component, new()
{
var clone = new TComponent();
var srcProperties = System.ComponentModel.TypeDescriptor.GetProperties(typeof(TComponent)).Cast<System.ComponentModel.PropertyDescriptor>();
foreach (var srcProperty in srcProperties)
{
srcProperty.SetValue(clone, srcProperty.GetValue(source));
}
return clone;
}
}
何コンソールのこの出力は次のとおりです。
PlayerController
Play erController
これは、TComponentが実際にソースのタイプであることを意味します。
全く同じことをしているときに、私のプロジェクトでどのように同じ結果が得られないのですか?
編集2:
ソースパラメータは、コンポーネントのリストから取られ、そして引数として使用した場合、私はそれは私与えます前に、それが正しい型のデバッグするときので、どうやらそれは...ルート・タイプに変換され、正しいタイプ。私はちょうどこれを回避する方法について別の質問をしなければならないと思う。
あなたは何を得るのですか'var x = new TComponent()'のように? – NetMage
@NetMageルートタイプを取得したようです... –
これで、 'TComponent'の型が分かりました。 – NetMage