From a54d58d064df5654e845f9b2b4fc9db5b0189db0 Mon Sep 17 00:00:00 2001
From: Shockah <me@shockah.pl>
Date: Thu, 10 Feb 2022 16:26:43 +0100
Subject: add TryProxy for any objects

---
 .../Framework/ModHelpers/ModRegistryHelper.cs      | 26 ++++++++++++++++++++++
 1 file changed, 26 insertions(+)

(limited to 'src/SMAPI/Framework')

diff --git a/src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs b/src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs
index ef1ad30c..92c52b00 100644
--- a/src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs
+++ b/src/SMAPI/Framework/ModHelpers/ModRegistryHelper.cs
@@ -98,5 +98,31 @@ namespace StardewModdingAPI.Framework.ModHelpers
                 return castApi;
             return this.ProxyFactory.CreateProxy<TInterface>(api, this.ModID, uniqueID);
         }
+
+        /// <inheritdoc />
+        public bool TryProxy<TInterface>(string uniqueID, object toProxy, out TInterface proxy) where TInterface : class
+        {
+            try
+            {
+                foreach (var toProxyInterface in toProxy.GetType().GetInterfaces())
+                {
+                    var unproxyBuilder = this.ProxyFactory.ObtainBuilder(typeof(TInterface), toProxyInterface, this.ModID, uniqueID);
+                    if (unproxyBuilder.TryUnproxy(toProxy, out object targetInstance))
+                    {
+                        proxy = (TInterface)targetInstance;
+                        return true;
+                    }
+                }
+
+                var proxyBuilder = this.ProxyFactory.ObtainBuilder(toProxy.GetType(), typeof(TInterface), this.ModID, uniqueID);
+                proxy = (TInterface)proxyBuilder.ObtainInstance(toProxy, this.ProxyFactory);
+                return true;
+            }
+            catch
+            {
+                proxy = null;
+                return false;
+            }
+        }
     }
 }
-- 
cgit