Skip to content

Instantly share code, notes, and snippets.

@cabbibo
Created February 15, 2017 17:18
Show Gist options
  • Save cabbibo/482cd67bb090281c628e070b12025a42 to your computer and use it in GitHub Desktop.
Save cabbibo/482cd67bb090281c628e070b12025a42 to your computer and use it in GitHub Desktop.
using System.Collections;
using System.Collections.Generic;
using System;
using System.Reflection;
using UnityEngine;
public static class AddComp {
public static T GetCopyOf<T>(this Component comp, T other) where T : Component
{
Type type = comp.GetType();
if (type != other.GetType()) return null; // type mis-match
BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default | BindingFlags.DeclaredOnly;
PropertyInfo[] pinfos = type.GetProperties(flags);
foreach (var pinfo in pinfos) {
if (pinfo.CanWrite) {
try {
pinfo.SetValue(comp, pinfo.GetValue(other, null), null);
}
catch { } // In case of NotImplementedException being thrown. For some reason specifying that exception didn't seem to catch it, so I didn't catch anything specific.
}
}
FieldInfo[] finfos = type.GetFields(flags);
foreach (var finfo in finfos) {
finfo.SetValue(comp, finfo.GetValue(other));
}
return comp as T;
}
public static T AddComponent<T>(this GameObject go, T toAdd) where T : Component
{
return go.AddComponent<T>().GetCopyOf(toAdd) as T;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment