mirror of
https://github.com/greenshot/greenshot
synced 2025-08-21 05:53:27 -07:00
BUG-2021 & BUG-2022: Fixes for exceptions.
This commit is contained in:
parent
14086923df
commit
35ed3b8d60
6 changed files with 51 additions and 26 deletions
|
@ -18,6 +18,7 @@
|
|||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
@ -26,7 +27,10 @@ using System.Runtime.Serialization;
|
|||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
|
||||
namespace GreenshotPlugin.Core {
|
||||
public static class Objects {
|
||||
/// <summary>
|
||||
/// Extension methods which work for objects
|
||||
/// </summary>
|
||||
public static class ObjectExtensions {
|
||||
|
||||
/// <summary>
|
||||
/// Perform a deep Copy of the object.
|
||||
|
@ -34,41 +38,56 @@ namespace GreenshotPlugin.Core {
|
|||
/// <typeparam name="T">The type of object being copied.</typeparam>
|
||||
/// <param name="source">The object instance to copy.</param>
|
||||
/// <returns>The copied object.</returns>
|
||||
public static T Clone<T>(this T source) {
|
||||
if (!typeof(T).IsSerializable) {
|
||||
throw new ArgumentException("The type must be serializable.", "source");
|
||||
public static T Clone<T>(this T source)
|
||||
{
|
||||
var typeparam = typeof(T);
|
||||
if (!typeparam.IsInterface && !typeparam.IsSerializable)
|
||||
{
|
||||
throw new ArgumentException("The type must be serializable.", nameof(source));
|
||||
}
|
||||
|
||||
|
||||
// Don't serialize a null object, simply return the default for that object
|
||||
if (ReferenceEquals(source, null)) {
|
||||
if (source == null) {
|
||||
return default(T);
|
||||
}
|
||||
|
||||
IFormatter formatter = new BinaryFormatter();
|
||||
Stream stream = new MemoryStream();
|
||||
using (stream) {
|
||||
using (var stream = new MemoryStream()) {
|
||||
formatter.Serialize(stream, source);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
return (T)formatter.Deserialize(stream);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clone the content from source to destination
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Type to clone</typeparam>
|
||||
/// <param name="source">Instance to copy from</param>
|
||||
/// <param name="destination">Instance to copy to</param>
|
||||
public static void CloneTo<T>(this T source, T destination) {
|
||||
Type type = typeof(T);
|
||||
FieldInfo[] myObjectFields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
|
||||
var type = typeof(T);
|
||||
var myObjectFields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
|
||||
|
||||
foreach (FieldInfo fi in myObjectFields) {
|
||||
fi.SetValue(destination, fi.GetValue(source));
|
||||
foreach (var fieldInfo in myObjectFields) {
|
||||
fieldInfo.SetValue(destination, fieldInfo.GetValue(source));
|
||||
}
|
||||
PropertyInfo[] myObjectProperties = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
|
||||
var myObjectProperties = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
|
||||
|
||||
foreach (PropertyInfo pi in myObjectProperties) {
|
||||
if (pi.CanWrite) {
|
||||
pi.SetValue(destination, pi.GetValue(source, null), null);
|
||||
foreach (var propertyInfo in myObjectProperties) {
|
||||
if (propertyInfo.CanWrite) {
|
||||
propertyInfo.SetValue(destination, propertyInfo.GetValue(source, null), null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Compare two lists
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="l1">IList</param>
|
||||
/// <param name="l2">IList</param>
|
||||
/// <returns>true if they are the same</returns>
|
||||
public static bool CompareLists<T>(IList<T> l1, IList<T> l2) {
|
||||
if (l1.Count != l2.Count) {
|
||||
return false;
|
Loading…
Add table
Add a link
Reference in a new issue